Python: вложенный для циклов - PullRequest
0 голосов
/ 25 июля 2011

У меня есть вопрос, который мне нужно задать. Вот часть моего сценария:

scan=file('indice.txt','r')
for i_L in range(10):
    for line in scan:
        a,b,c=line.split()
        do something ...
        ... ...
    print something
scan.close()

indice.txt - файл, содержащий 3 столбца действительных чисел.

Основная проблема заключается в том, что когда внешний цикл над i_L выполняется для первого значения i_L, цикл прерывается, и на выходе отображается только одно значение.

Кто-нибудь может помочь?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

Прежде чем вы снова начнете циклически повторять строки в файле, вы должны искать файл в начале:

scan=file('indice.txt','r')
for i_L in range(10):
    for line in scan:
        a,b,c=line.split()
        do something ...



        ...
    print something
    scan.seek(0)
scan.close()

См. file.seek .

Вам также следует сначала рассмотреть возможность кэширования строк, а затем работать с кешем.

1 голос
/ 17 ноября 2011

Вы также можете прочитать всю строку сразу в список и продолжать ее использовать (при условии, что этот indice.txt не похож на данные объемом 500 ГБ)

scan=file('indice.txt','r')
lst_scan = list(scan)
scan.close()
for i_L in range(10):
    for line in lst_scan:
        a,b,c=line.split()
        do something ...



        ...
    print something
0 голосов
/ 08 декабря 2011
for line in file:
    ...

является сокращением для

for line in iter(file.readline, ""):
    ...

Таким образом, вы можете видеть, что на самом деле он вызывает readline, который перемещает текущую позицию файла так же, как и другие файловые операции.Он не вернется к началу файла при повторной итерации, если вы не установите текущую позицию вручную, например:

yourfile.seek(0)

Также, если вы не хотите искать с последней позиции, ноне с самого начала, 2 «for..in ..» также не очень хороший способ, потому что он может иметь буфер, правильный путь к этому:

  it = iter(file)
  for line in it:
      if line == "\n":
          break
  for line in it:
      print line,

Пожалуйста, обратитесь к PEP234 дляподробнее об этом: http://www.python.org/dev/peps/pep-0234/ Это объясняет, как работают разные типы итераторов.И что происходит, когда вы перебираете файл.

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