Объединять строки разных файлов в Python

Если 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(), но это объединяет файлы по вертикали.

Вы пробовали панд?

BENY 20.04.2018 21:27

@Wen: Вы имеете в виду использование pd.concatenate?

HappyPy 20.04.2018 21:30

Да, здесь pd.concat

BENY 20.04.2018 21:32

Это можно сделать и без панд. Ты должен был хоть что-то попробовать.

roganjosh 20.04.2018 21:33

@roganjosh: Да. Я пробовал перебирать файлы и использовать file.read () и пробовал другие варианты (stackoverflow.com/questions/13613336/…), но все они объединяют файлы по вертикали.

HappyPy 20.04.2018 21:39

Нет необходимости в дополнительных инструментах. Просто рекомендую unix: paste -d' ' text1 text2 text3

llllllllll 20.04.2018 21:42

@liliscent: Спасибо! Но могу ли я использовать это в скрипте .py? Или вы имеете в виду делать это через командную строку?

HappyPy 20.04.2018 21:53

@HappyPy Это для благодарности. Вы также можете сделать это на Python. result = Popen(('paste', '-d ', 'text1', 'text2', 'text3')). Но если вы уже пишете скрипт Python, я рекомендую вам писать чистый Python.

llllllllll 20.04.2018 21:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
8
468
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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 20.04.2018 21:53

Конечно, есть способ, но я не могу вспомнить ни одного сейчас. Если разберусь, выложу.

davedwards 20.04.2018 22:05

@HappyPy см. Редактирование в обновленном ответе, он не очень чистый или оптимизированный, но, похоже, работает.

davedwards 20.04.2018 22:19

@davedwards В зависимости от того, со сколькими файлами OP работает (и / или их размером), использование readlines для каждого из них может привести к тому, что скрипту не хватит памяти. Похоже, та же потенциальная проблема и в другом ответе.

G_M 20.04.2018 22:30

@DeliriousLettuce Верно, особенно если это станет проблемой для других, использующих этот подход в будущем

davedwards 20.04.2018 22:36

Другие вопросы по теме