write with txt read open files and python file eof

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