You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Windows pathlib.Path.glob(pattern) fixed part of the pattern changed to lowercase whereas it should be unchanged. #75385
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2020-10-17.00:11:35.555>created_at=<Date2017-08-14.13:57:31.993>labels= ['type-bug', '3.8', '3.9', '3.7', 'library', 'OS-windows']
title='Windows pathlib.Path.glob(pattern) fixed part of the pattern changed to lowercase whereas it should be unchanged.'updated_at=<Date2020-10-17.00:11:35.552>user='https://github.com/brice-gros'
Windows pathlib.Path.glob(pattern) fixed part of the pattern to lowercase whereas it should be unchanged.
Note that this issue is different from http://bugs.python.org/issue26655 : "pathlib glob case sensitivity issue on Windows" where it was asked to get the actual case of the folder from the file system.
Assuming a directory contains a folder named 'Folder'.
On Windows, calling pathlib.Path().glob('Folder') gives 'folder', but 'Folde?' will return 'Folder'
This is an issue for instance if trying to glob files to put them in an archive to be sent to a case sensitive platform.
glob.glob() does behave properly though, Windows pathlib.Path is the only platform which has such a behavior.
I would expect Path.glob to output the same as glob.glob() for each platform.
From comments on http://bugs.python.org/issue19718 : "Path.glob() on case-insensitive Posix filesystems" it sounds that it should even match the native shell behavior.
And it looks like it is the case for linux and macOS, I tested that with the following script, whose results on win32, darwin and linux platforms follow:
#!/usr/bin/env python3.6
# Let's say this path exists : ./Folder/file
from pathlib import Path
import glob
import os
import sys
import subprocess
def ls(pattern):
if sys.platform in ('win32', 'win64'):
process = subprocess.run(['powershell', '-Command', f'dir {pattern}'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=os.getcwd(), encoding='utf-8')
if process.returncode:
return []
# expected output:
#
#
# Directory: C:\path_to\Folder
#
#
# Mode LastWriteTime Length Name
# ---- ------------- ------ ----
# -a---- 2017-08-14 10:16 0 file
lines = process.stdout.splitlines()
folder = os.path.basename(lines[2].split()[-1])
file = lines[7].split()[-1]
result = f"{folder}{os.path.sep}{file}"
return [result]
else:
cmd = ['ls', f'{pattern}']
process = subprocess.run(' '.join(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=os.getcwd(), encoding='utf-8', shell=True)
if process.returncode:
return []
return [process.stdout.strip()]
def main():
print(sys.platform)
p = Path('.')
tests = ['Folder/*', 'FOlder/*', 'F?lder/*', 'FOlde?/*', 'folder/*', 'f?lder/*']
for t in tests:
print(f'{t}:')
print(f' Path.glob(): {[str(f) for f in p.glob(t)]}')
print(f' glob.glob(): {[f for f in glob.glob(str(p/t))]}')
print(f' shell: {ls(str(p/t))}')
if __name__ == '__main__':
main()
Activity
brice-gros commentedon Aug 14, 2017
Windows pathlib.Path.glob(pattern) fixed part of the pattern to lowercase whereas it should be unchanged.
Note that this issue is different from http://bugs.python.org/issue26655 : "pathlib glob case sensitivity issue on Windows" where it was asked to get the actual case of the folder from the file system.
Assuming a directory contains a folder named 'Folder'.
On Windows, calling pathlib.Path().glob('Folder') gives 'folder', but 'Folde?' will return 'Folder'
This is an issue for instance if trying to glob files to put them in an archive to be sent to a case sensitive platform.
glob.glob() does behave properly though, Windows pathlib.Path is the only platform which has such a behavior.
I would expect Path.glob to output the same as glob.glob() for each platform.
From comments on http://bugs.python.org/issue19718 : "Path.glob() on case-insensitive Posix filesystems" it sounds that it should even match the native shell behavior.
And it looks like it is the case for linux and macOS, I tested that with the following script, whose results on win32, darwin and linux platforms follow:
zooba commentedon Oct 19, 2019
Bumping this - it's bitten me a couple of times as one of the build/release scripts relies on Path.glob().
serhiy-storchaka commentedon Oct 21, 2019
New changeset 10ecbad by Serhiy Storchaka in branch 'master':
bpo-31202: Preserve case of literal parts in Path.glob() on Windows. (GH-16860)
10ecbad
miss-islington commentedon Oct 21, 2019
New changeset 175abcc by Miss Skeleton (bot) in branch '3.7':
bpo-31202: Preserve case of literal parts in Path.glob() on Windows. (GH-16860)
175abcc
miss-islington commentedon Oct 21, 2019
New changeset 2f8d4f0 by Miss Skeleton (bot) in branch '3.8':
bpo-31202: Preserve case of literal parts in Path.glob() on Windows. (GH-16860)
2f8d4f0
iritkatriel commentedon Oct 16, 2020
Can this be closed?
brice-gros commentedon Oct 16, 2020
I think so, the original PR has been ported to 3.9, 3.8, 3.7, and all the PRs were merged.
zooba commentedon Oct 17, 2020
Yeah, looks done.