2015-02-12 5 views
1

У меня есть два файла:прочитанной строки из нескольких файлов

A:

John 
Kevin 
Richard 

B:

Manager 
Salesperson 
Doctor 

Я пытаюсь читать строки из обоих файлов одновременно и распечатаны следующие :

Выход:

John is a Manager 
Kevin is a Salesperson 
Richard is a Doctor 

Я пробовал использовать пакет contextlib.izip, но он не работает.

Код:

with open('name') as names: 
     with open('job') as jobs: 
       for names1 in names: 
         jobs1 = jobs.readlines() 
         print names1 + jobs1 

Но это бросает ошибку как

`TypeError: cannot concatenate 'str' and 'list' objects` 

Я также попытался с помощью пакета contextlib, но это не сработало.

+0

Возможный дубликат [Прочитать два текстовых файла по строке одновременно -python] (http://stackoverflow.com/questions/11295171/read-two-textfile-line-by-line-simultaneous-python) – skrrgwasme

ответ

4

Вы можете сделать это с помощью функции zip, и несколько менеджеров контекста:

with open('name') as name_file, open('job') as job_file: 

    for name_line, job_line in zip(name_file, job_file): 

     print("{} is a {}".format(
      name_line.strip(), job_line)) # don't forget to strip the newline 
              # from the names 

Этот код будет работать на Python 3. Если вы работаете в Python 2, используйте itertools.izip().

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

+0

приятно! Я не знал, что можно использовать несколько контекстов, подобных этому. Очень краткий! –

0

Вы в основном хотите:

# These can come from open("file").readlines() 
a = ("John", "Kevin", "Richard") 
b = ("Manager", "Salesperson", "Doctor") 

for person, role in zip(a, b): 
    print("{} is a {}".format(person, role)) 
0

Вы можете прочитать два файл отдельно, а затем заархивировать результаты

т.е.

with open('name') as f: 
    name = f.readlines() 

with open('job') as f: 
    job = f.readlines() 

roles = zip(name, job) 

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

with open('name') as names: 
    with open('job') as jobs: 
     for n in names: 
      for j in jobs: 
       print("{n} is a {j}".format(n=n, j=j)) 

Я предпочитаю первый вариант, потому что его более читаемый.

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