2012-11-09 1 views
0

У меня есть несколько каталогов и много файлов в каждой директории, и я хочу перебирать каждую из них. Я также хочу читать только строку 5th каждого файла, поэтому игнорировать первые четыре строки. Когда я запускаю скрипт, не игнорируя попытки игнорировать первые строки 4, он работает нормально. Вот код:Итерирование файлов в цикле и пропуски данных и чтение после этого дает ошибку

import os 

#find the present working directory 
pwd=os.path.dirname(os.path.abspath(__file__)) 

#find all the folders in the present working directory. 
dirs = [f for f in os.listdir('.') if os.path.isdir(f)] 

for directory in dirs: 
     os.chdir(os.path.join(pwd, directory)); 
     chd_dir = os.path.dirname(os.path.abspath(__file__)) 
     files = [ fl for fl in os.listdir('.') if os.path.isfile(fl) ] 
     print files 
     for f in files: 
       f_obj = open(os.path.join(chd_dir, f), 'r') 
       for i in xrange(0,4): #ignore the first 4 lines 
         f_obj.next() 
       s=f_obj.readline() 
       print s 
       f_obj.close() 

Этот сценарий дает следующее сообщение об ошибке: ValueError: Mixing iteration and read methods would lose data

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

+0

Вы изучали использование 'os.walk'? Это сделает то, что вы пытаетесь сделать более просто, и может устранить эту ошибку. –

+0

@COpython: 'os.walk' отлично, но не устранит ошибку. –

+0

@COpython Да, я знаю, я изменю это. На самом деле это был мой предыдущий вопрос о SO, я еще не изменил его. –

ответ

2

Вы можете камыш 5-й линии с методом .next():

s = f_obj.next() 

Файл итерационный метод использует буферизацию, чтобы оставаться эффективным, и этот буфер не используется совместно с .readline() и другие методы чтения объекта файла. Таким образом, вы будете пропускать данные при смешивании итераций и методов чтения.

От .next() method documentation:

In order to make a for loop the most efficient way of looping over the lines of a file (a very common operation), the next() method uses a hidden read-ahead buffer. As a consequence of using a read-ahead buffer, combining next() with other file methods (like readline()) does not work right.

Вы могли бы заменить .next() звонки с .readline() звонков, а также, просто быть последовательным и использовать один или другой.

+0

Мне также нужно знать, почему мой метод создает ошибку. В любом случае спасибо за исправление. –

+0

@AmanDeepGautam: добавляет ли мое дополнение к моему ответу? –

+0

это обязательно. .. :) –

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