Python 文件合并
我有一个数据文件夹,里面有每个参与者的子文件夹,这些参与者都是通过一个程序处理过的。比如,在这个数据文件夹里,有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
你没有使用到 sys
、string
或 os
,所以不需要导入这些东西。
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()