Конкатенация файлов Python - PullRequest
1 голос
/ 26 июля 2011

У меня есть папка данных с подпапками для каждого предмета, проходящего через программу. Так, например, в папке данных есть папки для Боба, Фреда и Тома. Каждая из этих папок содержит различные файлы и подпапки. Однако меня интересует только файл «summary.log», который содержится в папке каждого субъекта.

Я хочу объединить файл "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()

Это дает мне ошибку «неверный синтаксис» в строке «для имени файла», но я не уверен, что изменить.

Ответы [ 4 ]

1 голос
/ 26 июля 2011

Синтаксис не связан с использованием 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()
0 голосов
/ 26 июля 2011

Как показывает ответ 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'])

. Он проходит через все каталоги в дереве над стартовым каталогом и обеспечивает хорошее разделение между каталогами и файлами.

0 голосов
/ 26 июля 2011

В первом примере:

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 голосов
/ 26 июля 2011

Двоеточие (:) отсутствует в строке for.Кроме того, вы должны использовать with, потому что он обрабатывает закрытие файла (ваш код не является исключением исключений).

from glob import iglob
import shutil
import os

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

with open('summary.log', 'wb') as destination:
    for filename in iglob(os.path.join(PATH, '*.log')):
        with open(filename, 'rb') as in_:
            shutil.copyfileobj(in_, destination)
...