【发布时间】:2009-03-01 08:11:13
【问题描述】:
当使用 os.listdir 方法时,我需要知道结果列表中的哪个项目是目录还是只是一个文件。
当我必须遍历此列表中的所有目录,然后在每个目录中添加一个文件时,我遇到了一个问题。
有没有办法浏览这个列表并从中删除所有文件?如果无法使用 os.listdir,我应该改用什么方法?
谢谢。
【问题讨论】:
当使用 os.listdir 方法时,我需要知道结果列表中的哪个项目是目录还是只是一个文件。
当我必须遍历此列表中的所有目录,然后在每个目录中添加一个文件时,我遇到了一个问题。
有没有办法浏览这个列表并从中删除所有文件?如果无法使用 os.listdir,我应该改用什么方法?
谢谢。
【问题讨论】:
使用os.path.isdir 过滤掉目录。可能是这样的
dirs = filter(os.path.isdir, os.listdir('/path'))
for dir in dirs:
# add your file
【讨论】:
listdir() 不会以绝对路径返回给定路径(示例中为'/path')的文件和目录,而只是返回文件名。而且我认为isdir()/isfile()etc 相对于当前工作目录进行检查,因此filter() 可能不起作用,除非您将listdir 的返回值转换为路径。
这可能会更快:
current, dirs, files = os.walk('/path').next()
目录列表将在dirs 变量中。
【讨论】:
dirs = filter(os.path.isdir, os.listdir('/path'))
请注意,除非 '/path' 是当前工作目录,否则这将不起作用。 os.listdir() 返回叶子名称,所以你会问“os.path.isdir('file.txt')”,如果当前目录在别处,你会看到错误的“file.txt”。
os.path.join() 应该用于 os.listdir() 的输出以获得完整的文件名。
children= [os.path.join('/path', child) for child in os.listdir('/path')]
directories= filter(os.path.isdir, children)
【讨论】:
评估您当前目录的子项:
import os
# Creates a list with all children items
cd_children = os.listdir()
# Iterate through the list
for item in cd_children:
# If item is a directory (folder) do...
if os.path.isdir(item):
print('{:<13}{:<21}'.format('folder', item))
# If item is a file do ...
elif os.path.isfile(item):
print('{:<13}{:<21}'.format('file', item))
示例输出:
folder untitled folder
file 7972-orders.csv
file 8235-users.csv
file teads.py
file table.csv
【讨论】: