os.walk() 未能找到我的文件名
我正在尝试用一个Python脚本来循环编辑一个包含很多.html文件的大文件夹。但是我在用os.walk()循环文件名时遇到了问题。这段代码只是把html文件变成我可以处理的字符串,但脚本根本没有进入循环,就好像这些文件不存在一样。简单来说,它打印了point1
,但从来没有到达point2
。脚本结束时没有任何错误信息。这个文件夹是在一个叫“amazon”的文件夹里,里面有20个子文件夹,每个子文件夹里有20个html文件。
奇怪的是,这段代码在一个只包含.txt文件的相邻文件夹里运行得很好,但不知道为什么它似乎没有找到我的.html文件。我是不是对for root, dirs, filenames in os.walk()
循环的结构有什么不理解的地方?这是我第一次使用os.walk,我查阅了这个网站上的很多其他页面,想让它正常工作。
import os
rootdir = 'C:\filepath\amazon'
print "point1"
for root, dirs, filenames in os.walk(rootdir):
print "point2"
for file in filenames:
with open (os.path.join(root, file), 'r') as myfile:
g = myfile.read()
print g
非常感谢任何帮助。
4 个回答
我遇到过一个和这个问题类似的情况,涉及到 os.walk
。在Mac上,由于文件路径中有空格,系统会在路径中添加转义字符(\
),这导致了问题。
比如,路径:
/Volumes/MacHD/My Folder/MyFiles/...
在终端中访问时,会显示为:
/Volumes/MacHD/My\ Folder/MyFiles/...
解决办法是先把路径读成一个字符串,然后创建一个新的字符串,去掉那些转义字符,例如:
# Ask user for directory tree to scan for master files
masterpathraw = raw_input("Specify directory of master files:")
# Clear escape characters from the path
masterpath = masterpathraw.replace('\\', '')
# Provide this path to os.walk
for fullpath, _, filenames in os.walk(masterpath):
# Do stuff
你的问题是你在路径中使用了反斜杠:
>>> rootdir = 'C:\filepath\amazon'
>>> rootdir
'C:\x0cilepath\x07mazon'
>>> print(rootdir)
C:
ilepathmazon
因为在Python中,字符串使用反斜杠来转义特殊字符,所以在你的rootdir
中,\f
代表一个ASCII的换页符,而\a
代表一个ASCII的铃声字符。
你可以使用原始字符串(注意在引号前加个r
)来避免这个问题:
>>> rootdir = r'C:\filepath\amazon'
>>> rootdir
'C:\\filepath\\amazon'
>>> print(rootdir)
C:\filepath\amazon
...或者直接使用普通的斜杠,这在Windows上也能正常工作:
>>> rootdir = 'C:/filepath/amazon'
>>> rootdir
'C:/filepath/amazon'
>>> print(rootdir)
C:/filepath/amazon
正如Huu Nguyen所指出的,使用os.path.join()
来构建路径是一种好习惯,这样可以完全避免这个问题:
>>> rootdir = os.path.join('C:', 'filepath', 'amazon')
>>> rootdir
'C:\\filepath\\amazon' # presumably ... I don't use Windows.
>>> print(rootdir)
C:\filepath\amazon
你可以通过使用 os.path.join
来避免手动处理任何类型的斜杠。
rootdir = os.path.join('C:', 'filepath', 'amazon')
反斜杠(\)在编程中是用来表示转义字符的。你可以把它写两次(\\),或者在字符串前加一个“r”,这样就可以使用“原始字符串”。
举个例子:
>>> 'C:\filepath\amazon'
'C:\x0cilepath\x07mazon'
>>> r'\x'
'\\x'
>>> '\x'
ValueError: invalid \x escape