2016-05-24 2 views
0

Я пытаюсь объединить несколько TXT-файлов в один файл. Некоторые из файлов представляют собой текстовые текстовые файлы .txt, которые я создал заранее, а некоторые - файлы, написанные самим скриптом. Сценарий успешно объединяет некоторые файлы (те, которые я написал заранее), но не включает те, которые созданы скриптом, хотя он не вызывает ошибок. Это буквально, кажется, игнорирует их существование.Невозможно объединить файлы .txt с разными кодировками в Python

Я пробовал различные методы, в том числе и shutilfileinput, и даже с помощью cat из subprocess.call, но без удачи.

С терминала файлы, которые я создал заранее, являются «XML-документами» (хотя я фактически сохранил его как обычный текст, но он отформатирован как XML), а другие - «ASCII-текст». Я считаю, что это проблема, поскольку XML-файлы были .rtf, и они не сливались бы до того, как я их преобразовал, только первый из списка будет включен в выходной файл.

import os, itertools, subprocess, fileinput, shutil 

os.chdir('/Users/MicTonutti/Dropbox/MRes/Individual Project/FEBio/Simulation') 

forces = itertools.permutations([-1.5,-1,-0.5,0],3) 
forces = list(forces) 
force_node = 174 

for i in range(0,len(forces)): 
    filename = '0_Insert' + str(i) + '.txt' 
    f = open(filename, 'w') 
    string_x = '<nodal_load bc="x" lc="2"> <node id="' + str(force_node) + '">' + str(forces[i][1]) + '</node> </nodal_load>\n' 
    string_y = '<nodal_load bc="y" lc="2"> <node id="' + str(force_node) + '">' + str(forces[i][2]) + '</node> </nodal_load>\n' 
    string_z = '<nodal_load bc="z" lc="2"> <node id="' + str(force_node) + '">' + str(forces[i][2]) + '</node> </nodal_load>\n' 
    f.write(string_x + string_y + string_z) 

filename_2 = '1_Insert' + str(i) + '.txt' 
g = open(filename_2, 'w') 
string_1 = '<logfile>\n <node_data data="x;y;z" file = "coord_data' + str(i) + '.txt" delim=", "> </node_data>\n' 
string_2 = '<node_data data="ux;uy;uz" file = "displacement_data' + str(i) + '.txt" delim=", "> </node_data>\n </logfile>\n' 
g.write(string_1 + string_2) 

files_list = ['Simulation 1.txt', filename, 'Simulation 2.txt', filename_2, 'Simulation 3.txt'] 
output_file = '/Users/MicTonutti/Dropbox/MRes/Individual Project/FEBio/Simulation/Python Output/FEBio Simulation Output' + str(i) + '.txt' 

with open(output_file, 'w') as outfile: 
    for infile in files_list: 
     shutil.copyfileobj(open(infile), outfile) 

Выход в основном выглядит следующим образом:

Текст "Simulation1.txt" + «Текст Simulation2.txt + Текст "Simulation3.txt", без файлов в середине Любой. идеи?

Спасибо.

ответ

1

вы должны вызвать flush() на файлы, которые вы пишете, прежде чем пытаться читать их снова, иначе записываемые данные все еще могут быть помещены в буфер.

Кроме того, я хотел указать, что вы пишете 24 различных файлах 0_Insert в своем цикле (0_Insert1.txt до 0_Insert23.txt), но позже читайте только с последнего. Это то, что вы на самом деле пытаетесь сделать? Или должен ли ваш цикл включать нижнюю часть вашего кода?

+0

Да, извините - мой код был отформатирован неправильно, как только я его скопировал. Цикл for включает все до конца. Anyways, flush() отлично работает! Спасибо. – michetonu

Смежные вопросы