我尝试使用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
非常感谢任何帮助。
答案 0 :(得分:6)
反斜杠用作转义。要么将它们加倍,要么在其上加上前缀“r”来使用“原始字符串”。
示例:
>>> 'C:\filepath\amazon'
'C:\x0cilepath\x07mazon'
>>> r'\x'
'\\x'
>>> '\x'
ValueError: invalid \x escape
说明:In Python, what does preceding a string literal with “r” mean?
答案 1 :(得分:2)
您的问题是您在路径中使用反斜杠:
>>> rootdir = 'C:\filepath\amazon'
>>> rootdir
'C:\x0cilepath\x07mazon'
>>> print(rootdir)
C:
ilepathmazon
因为Python字符串使用反斜杠来转义特殊字符,所以rootdir
\f
代表ASCII Form Feed字符,而\a
代表ASCII {{3}字符。
你可以使用原始字符串(注意撇号之前的r
)来避免这种情况:
>>> rootdir = r'C:\filepath\amazon'
>>> rootdir
'C:\\filepath\\amazon'
>>> print(rootdir)
C:\filepath\amazon
...或者只使用常规斜杠,无论如何都在Windows上Bell:
>>> rootdir = 'C:/filepath/amazon'
>>> rootdir
'C:/filepath/amazon'
>>> print(rootdir)
C:/filepath/amazon
正如Huu Nguyen所指出的那样,在可能的情况下使用work fine构建路径被认为是一种良好的做法......这样就可以完全避免这个问题:
>>> rootdir = os.path.join('C:', 'filepath', 'amazon')
>>> rootdir
'C:\\filepath\\amazon' # presumably ... I don't use Windows.
>>> print(rootdir)
C:\filepath\amazon
答案 2 :(得分:2)
您可以使用os.path.join
rootdir = os.path.join('C:', 'filepath', 'amazon')
答案 3 :(得分: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