我可以做這樣的事情(其實它不工作)得到全路徑名
flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]
的感謝!
我可以做這樣的事情(其實它不工作)得到全路徑名
flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]
的感謝!
fnames
尚不存在。交換循環。
flist = [dirpath + f for dirpath, dirnames, fnames in os.walk('/home/user') for f in fnames]
+1:我*總是*在列表理解中以錯誤的方式獲得多個'for'。現在我完全避免它們。 – Johnsyweb 2011-06-08 12:14:04
@Johnsyweb:完全避免它們絕對是這裏的正確解決方案。 – 2011-06-08 13:46:08
flist = [os.path.join(pdir,f) for pdir, dirs, files in os.walk('/home/user') for f in files]
(os.path.join
應該被用來代替字符串連接來處理特定OS的隔膜和特性)
然而,正如一些已經指出的那樣,多級列表理解不是很可讀並容易出錯。
假設你真的想在列表中的結果:如果你只是使用flist
作爲中間存儲來遍歷
flist = []
for root, dirs, files in os.walk(root_dir):
flist.extend(os.path.join(root, f) for f in files)
# to support python <2.4, use flist.extend([...])
,使用生成如圖你可能會更好John's answer。
使用地圖:
map(lambda data: map(lambda file: data[0] + '\\' + file, data[2]), os.walk('/home/user'))
OR:
map(lambda data: map(lambda file: os.path.join(data[0], file), data[2]), os.walk('/home/user'))
'data [0] +'\\'+ file'而不是'os.path.join'是一個非常糟糕的主意。 – 2011-06-08 12:26:02
當然,你對它只是一個想法,如何在這裏使用map,並且字符串附加可以很容易地用os.path.join替換。 – 2011-06-08 12:27:30
個人而言,我會寫作爲發電機:
def filetree(top):
for dirpath, dirnames, fnames in os.walk(top):
for fname in fnames:
yield os.path.join(dirpath, fname)
那麼您可以使用它在一個循環:
for name in filetree('/home/user'):
do_something_with(name)
或啜食入列表:
flist = list(filetree('/home/user'))
path = '/home/user/' # keep trailing '/'
flist = [path+name for name in os.listdir(path)]
雙榜內涵是難以閱讀和理解。改用循環,你的問題就會消失。 – 2011-06-08 13:46:49