os.walk() 未能找到我的文件名

5 投票
4 回答
3222 浏览
提问于 2025-04-18 08:06

我正在尝试用一个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 个回答

0

我遇到过一个和这个问题类似的情况,涉及到 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
2

你的问题是你在路径中使用了反斜杠:

>>> 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
2

你可以通过使用 os.path.join 来避免手动处理任何类型的斜杠。

rootdir = os.path.join('C:', 'filepath', 'amazon')
6

反斜杠(\)在编程中是用来表示转义字符的。你可以把它写两次(\\),或者在字符串前加一个“r”,这样就可以使用“原始字符串”。

举个例子:

>>> 'C:\filepath\amazon'
'C:\x0cilepath\x07mazon'
>>> r'\x'
'\\x'
>>> '\x'
ValueError: invalid \x escape

解释:在Python中,字符串前加“r”是什么意思?

撰写回答