Python: обрезать текстовый файл перед записью

#python #truncate #write

#python #обрезать #запись файла

Вопрос:

У меня есть набор файлов .txt (12), которые я хочу прочитать и записать в 3 выходных файла .txt (поэтому каждый вывод будет содержать текст из всех 12 файлов).

Я делаю это с помощью следующего кода, НО файлы не перезаписывают то, что уже есть, а добавляют текст. Я понимаю, что это может быть связано с тем, что я использую «a» в качестве добавления, но если я использую «w», в каждый вывод записывается только первый документ из моих 12.

Метод «truncate ()», похоже, не имеет никакого эффекта.

 def WriteFiles():
# import library
import glob

# read file names
txt_files = glob.glob('input/*.txt')
output_files = glob.glob('output*')

# loop trough outputs amp; files and append
for index_out, output in enumerate(output_files):
    for index_in, file in enumerate(txt_files):
        with open(file, 'r ') as f, open(output, 'a') as o:
            print('Writing input {} to output {}'.format(index_in, index_out))
            o.truncate()
            o.write(f.read())
 

Комментарии:

1. Я думаю, вы почти на месте. Но после выполнения f.read() необходимо выполнить f.seek(0) или подобное, чтобы вы снова записывали в начале файла.

2. AFAI понимаю, проблема OPs связана с выводом, а не с вводом. В любом случае пример кода выполняет только 1 чтение для каждого open из входных файлов.

Ответ №1:

Вы могли бы просто open создать выходной файл раньше, в первом for цикле. Например.

 for index_out, output in enumerate(output_files):
    with open(output, 'w') as o:
        for index_in, file in enumerate(txt_files):
            with open(file, 'r ') as f:
                print('Writing input {} to output {}'.format(index_in, index_out))
                o.write(f.read())
 

Это приведет к открытию и усечению каждого выходного файла только один раз, перед запуском второго for цикла, и file объект будет следить за текущей позицией в выходном файле.

Комментарии:

1. Спасибо, это работает. Я попытался открыть файл ранее в цикле, но я поместил его в другое место в цикле, и это не сработало.