我试图找到*.txt
目录中的所有glob()
个文件。在某些情况下,glob.glob('some\path\*.txt')
给出一个空字符串,尽管给定目录中存在现有文件。如果path
全部为小写或数字,则尤其如此。
作为一个最小示例,我在a
驱动器上有两个文件夹A
和C:
,两个文件夹都包含一个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的答案。
答案 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资源管理器复制和粘贴路径,而无需添加或加反斜杠等。