Python中的目录列表
我在处理目录列表时遇到了问题。假设我有一个目录,里面有一些子目录,名字是从a到z、从0到9,还有一些特殊字符(比如%,-)。在每个子目录里,我有一些相关的xml文件。
所以,我需要读取这些文件的每一行。我尝试了以下代码。
def listFilesMain(dirpath):
for dirname, dirnames, filenames in os.walk(dirpath):
for subdirname in dirnames:
os.path.join(dirname, subdirname)
for filename in filenames:
fPath = os.path.join(dirname, filename)
fileListMain.append(fPath)
这段代码只有在我从子目录运行程序时才有效,但如果我从主目录运行,就没有任何结果。这是怎么回事呢?如果有人能帮忙,我将非常感激。谢谢!
2 个回答
1
By default, os.walk does not follow symbolic links to subdirectories on
systems that support them. In order to get this functionality, set the
optional argument 'followlinks' to true.
如果你的子目录是软链接(也就是指向其他地方的快捷方式),那么在使用os.walk(..)
的时候,要记得加上followlinks=True
这个参数。这个参数的作用是告诉程序要跟随这些软链接去查看里面的内容。具体的说明可以参考文档。
2
这样怎么样:
def list_files(dirpath):
files = []
for dirname, dirnames, filenames in os.walk(dirpath):
files += [os.path.join(dirname, filename) for filename in filenames]
return files
你也可以把这个做成一个生成器,这样就不需要一次性把整个列表都存起来:
def list_files(dirpath):
for dirname, dirnames, filenames in os.walk(dirpath):
for filename in filenames:
yield os.path.join(dirname, filename)
最后,你可能想要强制使用绝对路径:
def list_files(dirpath):
dirpath = os.path.abspath(dirpath)
for dirname, dirnames, filenames in os.walk(dirpath):
for filename in filenames:
yield os.path.join(dirname, filename)
所有这些都可以用一行代码来调用:
for filePath in list_files(dirpath):
# Check that the file is an XML file.
# Then handle the file.