Python 文件合并

1 投票
4 回答
4129 浏览
提问于 2025-04-16 22:17

我有一个数据文件夹,里面有每个参与者的子文件夹,这些参与者都是通过一个程序处理过的。比如,在这个数据文件夹里,有Bob、Fred和Tom的文件夹。每个文件夹里都有各种文件和子文件夹。不过,我只对每个参与者文件夹里的'summary.log'文件感兴趣。

我想把Bob、Fred和Tom的'summary.log'文件合并成一个新的日志文件,放在数据文件夹里。此外,我还想在每个日志文件中添加一列,列出参与者的编号。

这在Python中可以做到吗?还是有更简单的方法?我试过很多不同的代码,但都没有成功。例如,

#!/usr/bin/python

import sys, string, glob, os

fls = glob.glob(r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*');
outfile = open('summary.log','w');
for x in fls:
         file=open(x,'r');
         data=file.read();
         file.close();
         outfile.write(data);
outfile.close();

这段代码给我报了错,

Traceback (most recent call last):
  File "fileconcat.py", line 8, in <module>
    file=open(x,'r');
IOError: [Errno 21] Is a directory

我觉得这可能跟数据文件夹里有子文件夹有关,但我不知道该怎么解决。我还试过这个,但也没用:

from glob import iglob
import shutil
import os

PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*'

destination = open('summary.log', 'wb')
for filename in iglob(os.path.join(PATH, '*.log'))
    shutil.copyfileobj(open(filename, 'rb'), destination)
destination.close()

这段代码在"for filename"那一行给我报了“无效语法”的错误,但我不太确定该怎么改。

4 个回答

0

在你的第一个例子中:

import sys, string, glob, os

你没有使用到 sysstringos,所以不需要导入这些东西。

fls = glob.glob(r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*');

这里,你是在选择 主题文件夹。因为你对这些文件夹里的 summary.log 文件感兴趣,你可以把模式改成这样:

fls = glob.glob('/Users/slevclab/Desktop/Acceptability Judgement Task/data/*/summary.log')

在Python中,行末不需要用分号结束。

outfile = open('summary.log','w')
for x in fls:
     file = open(x, 'r')
     data = file.read()
     file.close()
     outfile.write(data)
outfile.close()
0

正如VGE的回答所示,你的第二个解决方案在修正了语法错误后是可以工作的。但要注意,更通用的解决方案是使用os.walk

>>> import os
>>> for i in os.walk('foo'):
...     print i
... 
('foo', ['bar', 'baz'], ['oof.txt'])
('foo/bar', [], ['rab.txt'])
('foo/baz', [], ['zab.txt'])

这个方法会遍历从起始目录开始的所有目录,并且能够很好地区分目录和文件。

1

这个语法和使用通配符(glob)没有关系。你忘记在for语句的末尾加上“:”了。

for filename in iglob(os.path.join(PATH, '*.log')):
                                                  ^--- missing

不过,下面这个模式是可以用的:

PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*/*.log'

destination = open('summary.log', 'wb')
for filename in iglob(PATH):
    shutil.copyfileobj(open(filename, 'rb'), destination)
destination.close()

撰写回答