我有一个简单的目录结构:
rootdir\
subdir1\
file1.tif
subdir2\
file2.tif
...
subdir13\
file13.tif
subdir14\
file14.tif
如果我打电话:
import os
print os.listdir('absolute\path\to\rootdir')
...然后我得到你期望的东西:
['subdir1', 'subdir2', ... 'subdir13', 'subdir14']
如果我在这些子目录上调用os.listdir(),也会发生同样的事情。对于每一个,它返回该目录中文件的名称。没有问题。
如果我打电话:
import os
for dirpath, dirnames, filenames in os.walk('absolute\path\to\rootdir'):
print filenames
print dirnames
...然后我得到你期望的东西:
[]
['subdir1', 'subdir2', ... 'subdir13', 'subdir14']
['file1.tif']
[]
['file2.tif']
[]
...
但这是奇怪的。我打电话的时候:
import os
for dirpath, dirnames, filenames in os.walk('absolute\path\to\rootdir'):
print filenames
print dirnames
print dirpath
......永远不会回来。即使我尝试:
print [each[0] for each in os.walk('absolute\path\to\roodir')]
......或任何类似的东西。我总是可以打印os.walk()返回的元组的第二和第三部分,但是当我尝试触摸第一部分时,整个事情就停止了。
更奇怪的是,此行为仅出现在使用shell启动的脚本中。命令行解释器正常运行。我很好奇,这里发生了什么?
- - - - - - - - EDIT 实际代码:
ALLOWED_IMGFORMATS = [".jpg",".tif"]
def getCategorizedFiles(pathname):
cats = [each[0] for each in os.walk(pathname) if not each[0] == pathname]
ncats = len(cats)
tree = [[] for i in range(ncats+1)]
for cat in cats:
catnum = int(os.path.basename(cat))
for item in os.listdir(cat):
if not item.endswith('.sift') and os.path.splitext(item)[-1].lower() in ALLOWED_IMGFORMATS:
tree[catnum].append(cat + '\\' + item)
fileDict = {cat : tree[cat] for cat in range(1,ncats+1)}
return fileDict
----编辑2 ---- 另一个发展。如上所述,当代码在从shell启动的脚本中时,存在此问题。但不是任何外壳。 Console 2存在问题,但Windows命令提示符不存在。当脚本从java启动时(我最初遇到问题的方式)也是如此:http://www.programmersheaven.com/mb/python/415726/415726/invoking-python-script-from-java/?S=B20000
答案 0 :(得分:1)
我从未真正信任os.walk()。只需编写自己的递归内容。这并不难:
def contents(folder, l): # Recursive, returns list of all files with full paths
directContents = os.listdir(folder)
for item in directContents:
if os.path.isfile(os.path.join(folder, item)):
l.append(os.path.join(folder, item))
else:contents(os.path.join(folder, item), l)
return l
contents = contents(folder, [])
然后 contents
将列出包含完整路径的所有文件。如果你想让它更容易阅读,你可以使用os.split()。
了解其工作原理消除了在代码中使用os.walk()的不确定性,这意味着您将能够识别代码中的问题是否真的与os.walk()有关。
如果您需要将它们放在字典中(因为字典也有别名优势),您也可以按照这种方式对文件进行排序。