#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. Спасибо, это работает. Я попытался открыть файл ранее в цикле, но я поместил его в другое место в цикле, и это не сработало.