开发者

get full path name using list comprehension in python

开发者 https://www.devze.com 2023-03-11 16:38 出处:网络
can I do something like this(actually the it doesn\'t work) flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk(\'/home/user\')]

can I do something like this(actually the it doesn't work)

flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]
开发者_如何学C

thanks!


fnames doesn't exist yet. Swap the loops.

flist = [dirpath + f for dirpath, dirnames, fnames in os.walk('/home/user') for f in fnames]


Personally I'd write it as a generator:

def filetree(top):
    for dirpath, dirnames, fnames in os.walk(top):
        for fname in fnames:
            yield os.path.join(dirpath, fname)

Then you can either use it in a loop:

for name in filetree('/home/user'):
    do_something_with(name)

or slurp it into a list:

flist = list(filetree('/home/user'))


flist = [os.path.join(pdir,f) for pdir, dirs, files in os.walk('/home/user') for f in files]

(os.path.join should be used instead of string concatenation to handle OS-specific separators and idiosyncrasies)

However, as several have already pointed out, multi-level list comprehension is not very readable and easy to get wrong.

Assuming you really do want to have the results in a list:

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([...])

If you're simply using flist as an intermediate storage to iterate through, you might be better off using a generator as shown in John's answer.


Using map:

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'))


path = '/home/user/'   # keep trailing '/'
flist = [path+name for name in os.listdir(path)]
0

精彩评论

暂无评论...
验证码 换一张
取 消