Python - объединить элементы из 2 файлов - PullRequest
0 голосов
/ 26 апреля 2018

Может ли кто-нибудь помочь мне с этим: у меня есть два файла, скажем:

Файл1:

 A1 B1 C1 D1 
 A2 B2 C2 D2 
 A3 B3 C3 D3 
 A4 B4 C4 D4 

Файл2:

A1 E1 
A4 E4 

Желаемый вывод:

A1 B1 C1 D1 E1
A2 B2 C2 D2 
A3 B3 C3 D3 
A4 B4 C4 D4 E4 

Это то, что я получил, и это не сработает:

>>>    for line1 in file1.readlines ():
>>>       s = line1.split ()
>>>        # do stuff...
>>>       for line2 in file2.readlines ():
>>>            ss = line2.split ()
>>>            if s [0] == ss[0]:
>>>                outfile.write (s + " " + ss [1])
>>>        # do some more stuff

Есть мысли?

1 Ответ

0 голосов
/ 26 апреля 2018

Я вижу ошибку в том, что вы пытаетесь объединить список s с двумя строками, но это не разрешено.Правильный способ - добавить дополнительный элемент ss[1] в список s, а затем распечатать результаты.Или просто используйте строку1 в качестве строки.

Вам также необходимо обработать случай, когда s[0] != ss[0], и в этом случае вы хотите просто распечатать line1.

Одно важное замечание касаетсяreadlines, поскольку он не сбрасывает указатель файла на начало файла автоматически при каждом его вызове.Вместо этого, как только указатель файла достиг конца, он остается там.

Мало возможных альтернатив.

  1. Добавить оператор file2.seek(0) непосредственно перед циклом поиска

  2. Загрузить содержимое файла (s) в списках и перебирать их, например:

    file1_content = open('file1.ext', 'r').readlines()

    for line1 in file1_content: ...

  3. Вставить оператор файла open вцикл for, например:

    for line2 in open('file2.ext', 'r')

    Обратите внимание, что файлы являются итеративными, поэтому вам не нужно readlines().

Лучшее решение зависит, конечно, от нескольких факторов.Я выберу здесь # 3, так как считаю более питоническим:

outfile = open('outfile.ext', 'w')
for line1 in open('file1.ext', 'r'):
    s = line1.split ()

    # reset search flag
    found = False

    # start search loop
    for line2 in open('file2.ext', 'r'):
        ss = line2.split ()

        # search for a match
        if s [0] == ss[0]:
           # match found: set the flag 
           found = True

           # write to file with additional element appended (*)
           outfile.write (line1.strip() + ' ' + ss[1] + '\n'))

    # No match found: just save the original line     
    if not found:
       outfile.write(line1)

(*) должна быть новая строка, которую мы удалим перед добавлением последнего элемента.Когда вы пишете в файл, мы должны добавить это обратно.

Также посмотрите здесь: https://eval.in/994943 или вариант здесь https://eval.in/994944

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...