为什么glob忽略了一些目录?

时间:2015-09-22 13:34:34

标签: python windows escaping glob backslash

我试图找到*.txt目录中的所有glob()个文件。在某些情况下,glob.glob('some\path\*.txt')给出一个空字符串,尽管给定目录中存在现有文件。如果path全部为小写或数字,则尤其如此。 作为一个最小示例,我在a驱动器上有两个文件夹AC:,两个文件夹都包含一个Test.txt文件。

import glob
files1 = glob.glob('C:\a\*.txt')
files2 = glob.glob('C:\A\*.txt')

产量

files1 = []
files2 = ['C:\\A\\Test.txt']

如果这是设计使然,是否有其他目录名称会导致这种意外行为?

(我在win 7上工作,使用Python 2.7.10(32位))

编辑:(2019)使用pathlib添加了Python 3的答案。

3 个答案:

答案 0 :(得分:3)

问题是\a在字符串文字(bell char)中有特殊含义。

在字符串文字中插入路径时只需加倍反斜杠(即使用"C:\\a\\*.txt")。

Python is different from C因为当你使用反斜杠和一个没有特殊含义的字符时(例如"\s"),Python会同时保留反斜杠和字母(在C中,你只需要{ {1}})。

这有时会隐藏这个问题,因为即使只有一个反斜杠(取决于目录名的第一个字母),事情仍然可以正常工作......

答案 1 :(得分:2)

我个人避免在Windows中使用双反斜杠,只使用Python的方便的原始字符串格式。只需将您的代码更改为以下内容,您就不必转义反斜杠:

import glob
files1 = glob.glob(r'C:\a\*.txt')
files2 = glob.glob(r'C:\A\*.txt')

注意字符串开头的r

如前所述,\a是Python中的一个特殊字符。这是Python的字符串文字列表的链接:

答案 2 :(得分:0)

由于我的原始答案吸引了比预期更多的观看次数,并且已经过去了一段时间。我想添加一个可以可靠地解决此类问题并且也跨平台兼容的答案。它位于Windows 10的python 3中,但也应在* nix系统上工作。

from pathlib import Path
filepath = Path(r'C:\a')
filelist = list(filepath.glob('*.txt'))

--> [WindowsPath('C:/a/Test.txt')]

我更喜欢此解决方案,因为我可以直接从Windows资源管理器复制和粘贴路径,而无需添加或加反斜杠等。