Перебор двух текстовых файлов в python - PullRequest
0 голосов
/ 19 июля 2011

У меня есть 2 текстовых файла, и я хочу перебрать их оба одновременно.

т.е:

File1:

  x1 y1 z1
A,53,45,23
B,65,45,32

File2:

  x2 y2  z2  
A,0.6,0.9,0.4
B,8.6,1.0,2.3

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

например:

c1 = x1*x2 + y1*y2 + z1*z2  #for first line
c2 = x1*x2 + y1*y2 + z1*z2  #for second line

Как можно это сделать с помощью Python?

Ответы [ 4 ]

6 голосов
/ 19 июля 2011

Вам нужно рассматривать оба файла как итераторы и архивировать их. Изип позволит вам читать файлы ленивым образом:

from itertools import izip

fa=open('file1')
fb=open('file2')
for x,y in izip(fa, fb):
    print x,y

Теперь, когда у вас есть пары строк, вы сможете анализировать их по мере необходимости и распечатывать правильную формулу.

1 голос
/ 19 июля 2011

Встроенная в Python функция zip() идеально подходит для этого:

>>> get_values = lambda line: map(float, line.strip().split(',')[1:])
>>> for line_from_1,line_from_2 in zip(open('file1'), open('file2')):
...     print zip(get_values(line_from_1), get_values(line_from_2))
...     print '--'
... 
[]
--
[(53.0, 0.6), (45.0, 0.9), (23.0, 0.4)]
--
[(65.0, 8.6), (45.0, 1.0), (32.0, 2.3)]
--
>>> 

С этого момента вы сможете использовать значения по своему усмотрению.Примерно так:

  print sum([x * y for x,y in zip(get_values(line_from_1), get_values(line_from_2))])

Я получаю такой результат:

81,5

677,6

0 голосов
/ 19 июля 2011

Все примеры, приведенные с использованием (i)zip, работают нормально, если все ваши данные синхронизированы в качестве примера. Если они не идут в ногу - иногда читая больше строк из одной, чем другой - функция next() - ваш друг. С его помощью вы можете настроить свои итераторы, а затем запрашивать новую строку в любой момент, когда захотите в потоке вашей программы.

0 голосов
/ 19 июля 2011

Это делает работу для меня:

with open("file1.txt") as f1, open("file2.txt") as f2:
    # Ignore header line and last newline
    files = f1.read().split("\n")[1:-1]
    files += f2.read().split("\n")[1:-1]

# Split values and remove row name from lists
# string -> float all values read
a1, a2, b1, b2 = (map(float, elem.split(",")[1:]) for elem in files)

# Group by row
a = zip(*[a1, b1])
b = zip(*[a2, b2])

c1 = sum(e1 * e2 for e1, e2 in a)
c2 = sum(e1 * e2 for e1, e2 in b)

Тогда результаты ...

>>> print c1
81.5
>>> print c2
677.6

РЕДАКТИРОВАТЬ: Если ваша версия Python не поддерживает колдовство, вы можете сделать:

# Open files, dont forget to close them!    
f1 = open("file1.txt")
f2 = open("file2.txt")

# Ignore header line and last newline
files = f1.read().split("\n")[1:-1]
files += f2.read().split("\n")[1:-1]

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