Если text1
1 2 3
1 2 3 4
1 2 3
1
text2
4 5 6 7
5 6 7 8
4 5
2 3 4 5 6
и text3
8 9 10 11
9
6 7 8
7
Каков самый прямой способ объединить строки разных файлов вместе и записать полученный текст в файл?
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7
Я пробовал перебирать файлы и использовать file.read(), но это объединяет файлы по вертикали.
@Wen: Вы имеете в виду использование pd.concatenate?
Да, здесь pd.concat
Это можно сделать и без панд. Ты должен был хоть что-то попробовать.
@roganjosh: Да. Я пробовал перебирать файлы и использовать file.read () и пробовал другие варианты (stackoverflow.com/questions/13613336/…), но все они объединяют файлы по вертикали.
Нет необходимости в дополнительных инструментах. Просто рекомендую unix: paste -d' ' text1 text2 text3
@liliscent: Спасибо! Но могу ли я использовать это в скрипте .py? Или вы имеете в виду делать это через командную строку?
@HappyPy Это для благодарности. Вы также можете сделать это на Python. result = Popen(('paste', '-d ', 'text1', 'text2', 'text3')). Но если вы уже пишете скрипт Python, я рекомендую вам писать чистый Python.






Я думаю, что с пандами проще, но вы можете обойтись без панд.
file_names = ['file1.txt','file2.txt','file3.txt']
res = []
for name in file_names:
with open(name,'rb') as f:
res.append(f.readlines())
res = [(' '.join(map(lambda row:row.strip(),line)) + '\n') for line in zip(*res)]
выход:
['1 2 3 4 5 6 7 8 9 10 11\n',
'1 2 3 4 5 6 7 8 9\n',
'1 2 3 4 5 6 7 8\n',
'1 2 3 4 5 6 7\n']
Другой вариант - использовать zip для объединения строк в текстовых файлах:
with open('text1', 'r') as f1:
t1 = f1.readlines()
with open('text2', 'r') as f2:
t2 = f2.readlines()
with open('text3', 'r') as f3:
t3 = f3.readlines()
for item in zip(t1,t2,t3):
print ' '.join([line.strip() for line in item])
результат:
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7
Редактировать: Более обобщенное решение:
files = ['text1', 'text2', 'text3']
contents = []
for f in files:
with open(f, 'r') as fn:
contents.append(fn.readlines())
for entry in zip(contents):
for item in entry:
print ' '.join([line.strip() for line in item])
Спасибо. Есть ли способ сделать это более общим, например, определить список файлов в начале, вместо того, чтобы писать «с открытым ...» для каждого файла?
Конечно, есть способ, но я не могу вспомнить ни одного сейчас. Если разберусь, выложу.
@HappyPy см. Редактирование в обновленном ответе, он не очень чистый или оптимизированный, но, похоже, работает.
@davedwards В зависимости от того, со сколькими файлами OP работает (и / или их размером), использование readlines для каждого из них может привести к тому, что скрипту не хватит памяти. Похоже, та же потенциальная проблема и в другом ответе.
@DeliriousLettuce Верно, особенно если это станет проблемой для других, использующих этот подход в будущем
Вы пробовали панд?