Python:解析并分组目录中的文件名

3 投票
2 回答
11168 浏览
提问于 2025-04-17 14:53

我对Python还很陌生,但我在MATLAB和C语言方面有很多经验。

我需要做的是解析一个特定文件夹里文件的名字,把它们根据名字里的不同部分分成几个组,然后对这些组里的文件进行操作。

具体来说,文件名是:

PROJECT-x-SUBJECT-x-SESSION-x-TYPE.extension

其中,'-x-'是我故意放进去的,用来分隔不同部分的标记。我需要对每一组文件进行操作,这些文件的名字中有相同的PROJECT-x-SUBJECT-x-SESSION部分。

_______这是我目前最好的尝试: ________

我可以通过以下方式逐个解析每个文件:

dirList=os.listdir(directory)
for fname in dirList:  
    # kill extension
    ext = os.path.splitext(fname)
    # get the 4 fields 
    labels=ext[0].split('-x-')
    PROJECT_list.append(labels[0])
    SUBJECT_list.append(labels[1])
    ...

... 这只是我想到的一个组织这些文件名的方式:创建4个列表,并把每个文件名添加到相应的列表中。

然后,利用这4个(有序的?)列表,我可以调用类似下面的东西:

from collections import Counter
c=Counter(SESSION_list) 
list(c)

这样我至少可以得到一个独特的SESSION名称列表

有什么建议吗?我可以继续说,但因为我只是需要一个起点,我觉得这些信息已经足够了。

谢谢大家。

2 个回答

1

可以考虑使用一个叫做 defaultdict 的工具来把文件名分组,使用 glob 来找到合适的文件,然后用 fileinput 来读取所有同一组文件中的内容。(这个方法还没测试过)

import os
from glob import glob
import fileinput
from collections import defaultdict

filenames = glob('*-x-*')
dd = defaultdict(list)
for filename in filenames:
    name, ext = os.path.splitext(filename)
    dd[tuple(name.split('-x-')[:3])].append(filename)

for key, fnames in dd.iteritems():
     for line in fileinput.FileInput(fnames):
         pass # do something with lines from files with same key
8

你可以使用 defaultdict 来创建一个包含列表的字典:

from collections import defaultdict

groups = defaultdict(list)

for filename in os.listdir(directory):
    basename, extension = os.path.splitext(filename)
    project, subject, session, ftype = basename.split('-x-')

    groups[session].append(filename)

现在,groups 里存储的是会话名称和文件名之间的对应关系。

撰写回答