2013-11-02 2 views
0

Мне было интересно, сможет ли кто-нибудь помочь мне в объединении двух файлов.Объединение файлов в python

Первый файл выглядит

AAAA

BBBB

КПКГ

DDDD

ЕЕЕЕ

И второе, как

аааа

BBBB

сссс

дддд

ээээ

и я ищу что-то заканчивается, как

AAAAAAAA

BBBBBBBB

CCCCCCCC

DDDDDDDD

EEEEEEEE

До сих пор я могу только скопировать первый файл в другой, но это всегда заканчивается удалив изначально содержимое файла.

+1

Прочитав последнюю строку, я предлагаю вам открыть третий комбинированный файл вместо того, чтобы писать первый файл во второй файл. Но в любом случае, вы должны действительно показать нам, что вы попробовали, чтобы мы могли помочь вам исправить это. – yuvi

ответ

2

Вот пример, который использует

  • for line in f и generators сделать для эффективного чтения файлов
  • str.strip(), чтобы избавиться от неиспользованного
  • zip встроенный, чтобы объединить два списка строк
  • str.join(), чтобы присоединиться к окончательному списку выходных строк с символами новой строки.

combine.py

def read_lines(f): 
    for line in f: 
     if line.strip(): 
      yield line.strip() 


def combine(lines): 
    for (first, second) in lines: 
     yield "%s%s\n" % (first, second) 

lines1 = read_lines(open('first.txt')) 
lines2 = read_lines(open('second.txt')) 

lines = zip(lines1, lines2) 

merged = '\n'.join(combine(lines)) 

with open('merged.txt', 'w') as outfile: 
    outfile.write(merged) 

Этот код не предполагает, что каждая строка, которая имеет значение в четном числе линии, но вместо этого проверяет, является ли строка содержит ничего, кроме пробельных - если да , это процесс, иначе нет.

+0

Это приемлемое решение. Но лучше всего на Python просто сказать 'if line.strip():' а не 'if not line.strip() == '':'. Кроме того, лучше всего использовать оператор 'with' вместе с вызовом' open() ', чтобы гарантировать, что файл всегда правильно закрыт. Кроме того, с небольшой работой, это может сделать всю обработку по одной строке за раз и не нужно читать во всех данных ... это не имеет значения для небольших входных файлов, но будет важно для больших файлов данных. Мне определенно нравится способ 'read_lines()' отделяет логику фильтрации ввода от остальной части кода. – steveha

+0

@steveha I * do * использовать диспетчер контекстов 'open()' для файла, в который я пишу. Для файлов, которые только что читаются, сбор мусора позаботится о них, поэтому использование оператора 'with' просто загромождает код и делает его менее читаемым. –

+0

Да, этот код по-прежнему не оптимизирован для использования в памяти - но делать это было бы намного труднее для чтения, но менее поучительно. Что касается 'if line.strip()': Point taked, отредактирует ответ. Стоит отметить, что это не делает то же самое, что и 'line.strip() == ''' - None также может вызывать это выражение как 'False' (хотя, конечно,' strip() 'никогда не вернется 'None '). –

0

Это ответ Локаса Графа, переписанный немного, так что он просто держит одну строку за раз от каждого входного файла, вместо того, чтобы читать во всех линиях одновременно.Он также использует with для ввода/вывода файлов.

from itertools import izip 

def read_lines(f): 
    for line in f: 
     s = line.strip() 
     if s: 
      yield s 

def collect_input(fname0, fname1): 
    # Multiple open() on one with only works in Python 2.7 or 3.1+. 
    # For Python 2.5, 2.6, or 3.0 you can use two nested with statements 
    # or use contextlib.nested(). 
    with open(fname0, "rt") as f0, open(fname1, "rt") as f1: 
     for line0, line1 in izip(read_lines(f0), read_lines(f1)): 
      yield "%s%s\n" % (line0.strip(), line1.strip()) 

with open('merged.txt', "wt") as f: 
    for line in collect_input('first.txt', 'second.txt'): 
     f.write(line) 
+0

Возможно, вы должны заметить, что это будет работать только в Python 2.7/3.x. В <2.7 вам нужно будет использовать два вложенных оператора 'with' (две в одной строке, разделенные запятой, еще не поддерживаются), добавив еще один уровень отступов. Это еще одна причина, по которой я не использовал диспетчер контекста для входных файлов в своем ответе. –

+0

Хорошо, я добавил комментарий. Я не уверен, сколько людей все еще застряло на Python 2.5, 2.6 или 3.0, тем более, что теперь Cygwin наконец получил Python 2.7. Мне действительно нравится заявление с заявлением, и я хочу поощрять его использование; Я думаю, что код выглядит хорошо и легко понять, и он будет работать одинаково хорошо в PyPy. Самая важная часть состоит в том, что это больше не считывает все входные файлы в память, а только одну строку из каждого входного файла за раз. Для этой учебной программы это не имеет значения, но хорошо учиться делать это таким образом, если вам когда-либо понадобится обрабатывать гигантские файлы. – steveha

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