python - with - ¿Cómo saber si un archivo está en su `eof`?
txt files in python (14)
fp = open("a.txt")
#do many things with fp
c = fp.read()
if c is None:
print ''fp is at the eof''
Además del método anterior, ¿hay alguna otra manera de saber si fp ya está en eof?
Al hacer operaciones de E / S binarias, el siguiente método es útil:
while f.read(1):
f.seek(-1,1)
# whatever
La ventaja es que a veces está procesando una transmisión binaria y no sabe de antemano cuánto necesitará leer.
Argumentaría que leer del archivo es la forma más confiable de establecer si contiene más datos. Podría ser un conducto, u otro proceso podría estar agregando datos al archivo, etc.
Si sabes que eso no es un problema, podrías usar algo como:
f.tell() == os.fstat(f.fileno()).st_size
Aunque personalmente usaría una declaración with
para manejar la apertura y el cierre de un archivo, en el caso en que tenga que leer de stdin y necesite rastrear una excepción EOF, haga algo como esto:
Utilice un try-catch con EOFError
como excepción:
try:
input_lines = ''''
for line in sys.stdin.readlines():
input_lines += line
except EOFError as e:
print e
Como python devuelve una cadena vacía en EOF y no en "EOF", simplemente verifique el código, escrito aquí
f1 = open("sample.txt")
while True :
line = f1.readline()
print line
if ("" == line):
print "file finished"
break;
El diseño "por-lo-cierto" a menudo se pasa por alto. Ver: Python Docs "Control de flujo en bucle" :
Ejemplo
with open(''foobar.file'', ''rb'') as f:
for line in f:
foo()
else:
# No more lines to be read from file
bar()
Las funciones de lectura Python devolverán una cadena vacía si alcanzan EOF
Puede comparar el valor devuelto de fp.tell()
antes y después de llamar al método de read
. Si devuelven el mismo valor, fp está en eof.
Además, no creo que tu código de ejemplo realmente funcione. El método de read
que yo sepa nunca devuelve None
, pero devuelve una cadena vacía en eof.
Puede usar el siguiente fragmento de código para leer línea por línea, hasta el final del archivo:
line = obj.readline()
while(line != ''''):
# Do Something
line = obj.readline()
Si el archivo se abre en modo no bloqueado, devolver menos bytes de lo esperado no significa que esté en eof, diría que la respuesta de @NPE es la manera más confiable:
f.tell () == os.fstat (f.fileno ()). st_size
Yo uso esta función:
# Returns True if End-Of-File is reached
def EOF(f):
current_pos = f.tell()
file_size = os.fstat(f.fileno()).st_size
return current_pos >= file_size
read devuelve una cadena vacía cuando se encuentra EOF. Los doctores están aquí .
fp.read()
lee hasta el final del archivo, por lo que una vez que ha finalizado correctamente, usted sabe que el archivo está en EOF; no hay necesidad de verificar Si no puede llegar a EOF, se generará una excepción.
Cuando lee un archivo en fragmentos en lugar de read()
, sabe que ha pulsado EOF cuando la read
devuelve menos que el número de bytes que ha solicitado. En ese caso, la siguiente llamada de read
devolverá la cadena vacía (no None
). El siguiente ciclo lee un archivo en fragmentos; llamará a read
a lo sumo una vez más.
assert n > 0
while True:
chunk = fp.read(n)
if chunk == '''':
break
process(chunk)
O, más corto:
for chunk in iter(lambda: fp.read(n), ''''):
process(chunk)
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>
Puede usar los métodos de archivo seek () y tell () para determinar la posición del final del archivo. Una vez que se encuentra la posición, vuelva al inicio del archivo
f=open(file_name)
for line in f:
print line