如何在lis中按路径对文件进行分组

2024-03-29 13:50:59 发布

您现在位置:Python中文网/ 问答频道 /正文

从这个字符串列表中可以得到:

['/User/someuser/file.py', '/tmp/download/file.zip', '/tmp/download/file2.zip', '/', '/usr/local/bin', '/tmp/file.txt']

列这个清单

[('/tmp/download', ('file.zip', 'file2.zip')), ('/tmp', ('file.txt',)),
 ('/User/someuser', ('file.py',)), ('/', ()), ('/usr/local/bin', ())]

Tags: 字符串pytxt列表bindownloadusrlocal
3条回答

使用^{}将路径名拆分为dirname和basename。然后使用itertools.groupby将文件分组在一起。你知道吗

import os
from itertools import groupby


l= ['/User/someuser/file.py', '/tmp/download/file.zip', '/tmp/download/file2.zip', '/', '/usr/local/bin', '/tmp/file.txt']

print([(k, tuple(i[1] for i in g)) for k, g in groupby(map(os.path.split, sorted(l)), key=lambda x: x[0])])

印刷品

[('/', ('',)), ('/User/someuser', ('file.py',)), ('/tmp/download', ('file.zip', 'file2.zip')), ('/tmp', ('file.txt',)), ('/usr/local', ('bin',))]

可以使用groupbyos.path

from itertools import groupby
import os
L = ['/User/someuser/file.py', '/tmp/download/file.zip', '/tmp/download/file2.zip', '/', '/usr/local/bin', '/tmp/file.txt']
#if all files have extention, convert '/usr/local/bin' to '/usr/local/bin/'
L_fix =  [e if os.path.splitext(e)[1] else os.path.join(e,"") for e in L]
[(k,tuple(map(os.path.basename,v))) for k,v in groupby(L_fix, os.path.dirname)]

你得到了

[('/User/someuser', ('file.py',)),
 ('/tmp/download', ('file.zip', 'file2.zip')),
 ('/', ('',)),
 ('/usr/local/bin', ('',)),
 ('/tmp', ('file.txt',))]

可以使用^{}^{}作为:

from collections import defaultdict
import os

my_list = ['/User/someuser/file.py', '/tmp/download/file.zip', '/tmp/download/file2.zip', '/', '/usr/local/bin', '/tmp/file.txt']
my_dict = defaultdict(list)

for item in my_list:
    if os.path.isdir(item):   # To check path is a directory
        _ = my_dict[item]   # will set default value as empty list
    else:
        path, file = os.path.split(item)
        my_dict[path].append(file)

# where `my_dict` is `dict` object holding value:
# {'/tmp/download': ['file.zip', 'file2.zip'], '/tmp': ['file.txt'], '/usr/local/bin': [], '/': [], '/User/someuser': ['file.py']}

要将my_dict转换为所需格式的列表,请执行以下操作:

>>> my_dict.items()
[   # Formatted in order to make more readable
    ('/tmp/download', ['file.zip', 'file2.zip']), 
    ('/tmp', ['file.txt']), 
    ('/usr/local/bin', []), 
    ('/', []), 
    ('/User/someuser', ['file.py'])
]

相关问题 更多 >