Как узнать, находится ли файл в `eof`?

fp = open("a.txt") #do many things with fp c = fp.read() if c is None: print 'fp is at the eof' 

Помимо вышеописанного метода, любой другой способ узнать, является ли fp уже на eof?

fp.read() читает до конца файла, поэтому после его успешного завершения вы знаете, что файл находится в EOF; нет необходимости проверять. Если он не сможет достичь EOF, это вызовет исключение.

При чтении файла в кусках, а не в read() , вы знаете, что вы попали в EOF, когда read возвращается меньше, чем количество запрошенных вами байтов. В этом случае следующий вызов read возвращает пустую строку (не None ). Следующий цикл читает файл в кусках; он будет вызывать read не более одного раза слишком много.

 assert n > 0 while True: chunk = fp.read(n) if chunk == '': break process(chunk) 

Или, короче:

 for chunk in iter(lambda: fp.read(n), ''): process(chunk) 

Дизайн «for-else» часто пропускается. См .: Документы Python «Управление потоком в цикле» :

пример

 with open('foobar.file', 'rb') as f: for line in f: foo() else: # No more lines to be read from file bar() 

Я бы сказал, что чтение из файла – это самый надежный способ установить, содержит ли он больше данных. Это может быть канал, или другой процесс может быть добавлением данных в файл и т. Д.

Если вы знаете, что это не проблема, вы можете использовать что-то вроде:

 f.tell() == os.fstat(f.fileno()).st_size 

При выполнении двоичного ввода-вывода полезен следующий метод:

 while f.read(1): f.seek(-1,1) # whatever 

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

Вы можете сравнить возвращаемое значение fp.tell() до и после вызова метода read . Если они возвращают одно и то же значение, fp находится на уровне eof.

Кроме того, я не думаю, что ваш пример кода действительно работает. Метод read насколько мне известно, никогда не возвращает None , но возвращает верную пустую строку на eof.

read возвращает пустую строку, когда встречается EOF. Документы здесь .

 f=open(file_name) for line in f: print line 

Функции чтения Python возвращают пустую строку, если они достигают EOF

Если файл открывается в неблокированном режиме, возврат меньшего количества байтов, чем ожидалось, не означает, что он находится на высоте, я бы сказал, что ответ NPE является самым надежным способом:

f.tell () == os.fstat (f.fileno ()). st_size

Поскольку python возвращает пустую строку на EOF, а не сам «EOF», поэтому просто проверьте код для него, написанный здесь

 f1 = open("sample.txt") while True : line = f1.readline() print line if ("" == line): print "file finished" break; 

Хотя я лично использовал бы оператор with для открытия и закрытия файла, в случае, когда вам нужно читать из stdin и нужно отслеживать исключение EOF, сделайте что-то вроде этого:

Используйте try-catch с EOFError как исключение:

 try: input_lines = '' for line in sys.stdin.readlines(): input_lines += line except EOFError as e: print e 
 f = open(filename,'r') f.seek(-1,2) # go to the file end. eof = f.tell() # get the end of file location f.seek(0,0) # go back to file beginning while(f.tell() != eof): <body> 

Вы можете использовать методы file seek () и tell () для определения положения конца файла. Как только позиция будет найдена, вернитесь к началу файла

Я использую эту функцию:

 def EOF(f): current_pos = f.tell() file_size = os.fstat(f.fileno()).st_size return current_pos < file_size 

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

 line = obj.readline() while(line != ''): # Do Something line = obj.readline()