Создайте итоговый текстовый файл папки с именем файла и первыми двумя строками из каждого файла.

У меня есть каталог с более чем 260 текстовыми файлами, содержащими информацию о подсчете очков. Я хочу создать сводный текстовый файл всех этих файлов, содержащий имя файла и первые две строки каждого файла. Моя идея состояла в том, чтобы создать два списка отдельно и «заархивировать» их. Однако я могу получить список имен файлов, но я не могу получить первые две строки файла в добавленный список. Вот мой код:

# creating a list of filename
for f in os.listdir("../scores"):
    (pdb, extension) = os.path.splitext(f)
    name.append(pdb[1:5])

# creating a list of the first two lines of each file
for f in os.listdir("../scores"):
    for line in open(f):
        score.append(line)
        b = f.nextline()
        score.append(b)

Я получаю сообщение об ошибке, что str не имеет атрибута nextline. Пожалуйста, помогите, заранее спасибо.


person sat_s    schedule 16.07.2010    source источник
comment
Почему бы не использовать имя файла и первые две строки в одном цикле?   -  person David Z    schedule 16.07.2010
comment
Это не python, поэтому я не буду указывать его в ответе, но лучше всего (при условии, что Unix) использовать команды bash: head -2 ../scores/* >summary.txt   -  person perimosocordiae    schedule 16.07.2010


Ответы (4)


Проблема, с которой вы сталкиваетесь, является результатом попытки получить более одной строки из файла результатов с помощью итератора файла (for line in f). Вот быстрое решение (один из нескольких способов сделать это, я уверен):

# creating a list of the first two lines of each file
for f in os.listdir("../scores"):
    with open(f) as fh:
        score.append(fh.readline())
        score.append(fh.readline())

Оператор with позаботится о закрытии файла для вас после того, как вы закончите, и предоставит вам объект дескриптора файла (fh), из которого вы можете взять строки вручную.

person perimosocordiae    schedule 16.07.2010
comment
Спасибо! Сработало удовольствие, теперь оно работает. Я поместил обе части в одну петлю. Ваше здоровье! - person sat_s; 17.07.2010

Файловые объекты имеют метод next(), а не nextline().

person msw    schedule 16.07.2010

Объединение комментария Дэвида и ответа perimosocordiae:

from __future__ import with_statement
from itertools import islice
import os
NUM_LINES = 2
with open('../dir_summary.txt','w') as dir_summary:
  for f in os.listdir('.'):
    with open(f) as tf:
      dir_summary.write('%s: %s\n' % (f, repr(', '.join(islice(tf,NUM_LINES)))))
person mechanical_meat    schedule 16.07.2010

Вот моя, может быть, более старомодная версия с перенаправленной печатью для облегчения новой строки.

## written for Python 2.7, summarize filename and two first lines of files of given filetype
import os
extension = '.txt' ## replace with extension of desired files
os.chdir('.') ## '../scores') ## location of files

summary = open('summary.txt','w')
# creating a list of filenames with right extension
for fn in [fn for fn in os.listdir(os.curdir) if os.path.isfile(fn) and fn.endswith(extension)]:
    with open(fn) as the_file:
        print >>summary, '**'+fn+'**'
        print >>summary, the_file.readline(), the_file.readline(),
        print >>summary, '-'*60
summary.close()
## show resulta
print(open('summary.txt').read())
person Tony Veijalainen    schedule 16.07.2010