Проблемы с циклом в Python - PullRequest
2 голосов
/ 05 февраля 2012

Я пытаюсь получить информацию из файла .txt таблицы данных из списка объектов в другом файле .txt.
в коде List.txt выглядит как

Obj2
Obj5
Obj6
etc.

и DataTable.txt выглядит примерно так:

Obj1    Data1
Obj2    Data2
Obj3    Data3
etc.

Я пытался

f = file('List.txt')
g = file('DataTable.txt')

for line in f:
    l = line.split()
    name = l[0]
    for row in g:
        if row.startswith(name):
            data = row.split()
            print data[8]

, но он печатает только данные для первой записи в списке.Может кто-нибудь найти проблему?

Ответы [ 4 ]

1 голос
/ 05 февраля 2012

Подводя итог прекрасным ответам, данным @Borealid и @ Ignacio,

f = file('List.txt')
g = file('DataTable.txt')

for line in f:
    l = line.split()
    name = l[0]
    g.seek(0)
    for row in g:
        if row.startswith(name):
            data = row.split()
            print data[8]
0 голосов
/ 05 февраля 2012

Перебирая файл, вы перемещаете позицию, с которой читаете. Думайте об этом как о курсоре, перемещающемся по файлу. Чтобы обойти эту проблему, просто прочитайте данные заранее и повторите это.

f = file('List.txt').read().splitlines()       #read in the whole file, then split on the lines
g = file('DataTable.txt').read().splitlines()  #read in the whole file, then split on the lines

for line in f:
    l = line.split()
    name = l[0]
    for row in g:
        if row.startswith(name):
            data = row.split()
            print data[8]
0 голосов
/ 05 февраля 2012

Проблема в том, что вы прошли через g в первой строке f. Во второй строке f, g больше нечего дать.

Вам необходимо сбросить g обратно на первую строку. Вы можете сделать это, поставив start_pos = g.tell() сразу после g.open, затем g.seek(start_pos) после завершения for row in g.

0 голосов
/ 05 февраля 2012

Итерации по file потребляют его.Либо вернитесь в начало, либо кэшируйте один из файлов в последовательности.

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