it-swarm.com.de

Wie kann man herausfinden, ob sich eine Datei in ihrem "eof" befindet?

fp = open("a.txt")
#do many things with fp

c = fp.read()
if c is None:
    print 'fp is at the eof'

Abgesehen von der oben genannten Methode gibt es keine andere Möglichkeit, um herauszufinden, ob fp bereits am eof ist.

45
Alcott

fp.read() liest bis zum Ende der Datei. Nach erfolgreichem Abschluss wissen Sie, dass sich die Datei im EOF befindet. es besteht keine Notwendigkeit zu überprüfen. Wenn EOF nicht erreicht wird, wird eine Ausnahme ausgelöst.

Wenn Sie eine Datei in Blöcken anstatt mit read() lesen, wissen Sie, dass Sie EOF gedrückt haben, wenn read weniger als die angeforderte Anzahl von Bytes zurückgibt. In diesem Fall gibt der folgende Aufruf read die leere Zeichenfolge zurück (nicht None). Die folgende Schleife liest eine Datei in Stücken. Es wird read höchstens einmal zu viele aufrufen.

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

Oder kürzer:

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

Das "for-else" -Design wird oft übersehen. Siehe: Python Docs "Kontrollfluss in Schleife" :

Beispiel

with open('foobar.file', 'rb') as f:
    for line in f:
        foo()

    else:
        # No more lines to be read from file
        bar()
41
Blake Atkinson

Ich würde argumentieren, dass das Lesen der Datei die zuverlässigste Methode ist, um festzustellen, ob sie mehr Daten enthält. Es kann sich um eine Pipe handeln, oder ein anderer Prozess hängt möglicherweise Daten an die Datei usw. an.

Wenn Sie wissen das ist kein Problem, könnten Sie etwas verwenden wie:

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

Bei der binären E/A ist die folgende Methode hilfreich:

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

Der Vorteil ist, dass Sie manchmal einen binären Stream verarbeiten und nicht im Voraus wissen, wie viel Sie lesen müssen.

10
user545424

Sie können den zurückgegebenen Wert von fp.tell() vor und nach dem Aufruf der read-Methode vergleichen. Wenn sie denselben Wert zurückgeben, ist fp bei eof.

Außerdem glaube ich nicht, dass Ihr Beispielcode tatsächlich funktioniert. Die read -Methode gibt meines Wissens niemals None zurück, aber sie liefert eine leere Zeichenfolge bei eof.

8

read gibt eine leere Zeichenfolge zurück, wenn EOF gefunden wird. Dokumente sind hier .

7
01100110

Da Python eine leere Zeichenfolge in EOF und nicht "EOF" selbst zurückgibt, können Sie einfach den hier beschriebenen Code überprüfen

f1 = open("sample.txt")

while True:
    line = f1.readline()
    print line
    if ("" == line):
        print "file finished"
        break;
6
tingtong
f=open(file_name)
for line in f:
   print line
5
samba

Wenn die Datei im Nicht-Block-Modus geöffnet wird, bedeutet die Rückgabe von weniger Bytes als erwartet nicht, dass sie bei eof liegt. Ich würde sagen, die Antwort von @ NPE ist die zuverlässigste Methode:

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

4
ymattw

Ich verstehe wirklich nicht, warum Python noch keine solche Funktion hat. Ich stimme auch nicht der folgenden Verwendung zu

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

Der Hauptgrund ist, dass f.tell() wahrscheinlich nicht für bestimmte Bedingungen geeignet ist.

Die Methode funktioniert für mich wie folgt. Wenn Sie einen Pseudocode wie den folgenden haben

while not EOF(f):
     line = f.readline()
     " do something with line"

Sie können es ersetzen durch:

lines = iter(f.readlines())
while True:
     try:
        line = next(lines)
        " do something with line"
     except StopIteration:
        break

Diese Methode ist einfach und Sie müssen die meisten Code nicht ändern.

2
Han Luo

Die Python-Lesefunktionen geben einen leeren String zurück, wenn sie EOF erreichen

2
mensi
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>

Sie können die Methoden fileseek () und tell () verwenden, um die Position des Dateiendes zu bestimmen. Sobald die Position gefunden wurde, kehren Sie zum Anfang der Datei zurück

1
Newstein

Sie können die tell()-Methode nach dem Erreichen der EOF verwenden, indem Sie die readlines() -Methode aufrufen:

fp=open('file_name','r')
lines=fp.readlines()
eof=fp.tell() # here we store the pointer
              # indicating the end of the file in eof
fp.seek(0) # we bring the cursor at the begining of the file
if eof != fp.tell(): # we check if the cursor
     do_something()  # reaches the end of the file
1
wamba

Rufen Sie die EOF - Position der Datei ab:

def get_eof_position(file_handle):
    original_position = file_handle.tell()
    eof_position = file_handle.seek(0, 2)
    file_handle.seek(original_position)
    return eof_position

und vergleichen Sie es mit der aktuellen Position: get_eof_position == file_handle.tell().

Lesen einer Datei in Stapeln von BATCH_SIZE Zeilen (der letzte Stapel kann kürzer sein):

BATCH_SIZE = 1000  # lines

with open('/path/to/a/file') as fin:
    eof = False
    while eof is False:
        # We use an iterator to check later if it was fully realized. This
        # is a way to know if we reached the EOF.
        # NOTE: file.tell() can't be used with iterators.
        batch_range = iter(range(BATCH_SIZE))
        acc = [line for (_, line) in Zip(batch_range, fin)]

        # DO SOMETHING WITH "acc"

        # If we still have something to iterate, we have read the whole
        # file.
        if any(batch_range):
            eof = True
0
boechat107

Python verfügt nicht über eine eingebaute Funktion zur EOF-Erkennung, diese Funktionalität ist jedoch auf zwei Arten verfügbar: f.read(1) gibt b'' zurück, wenn keine weiteren zu lesenden Bytes vorhanden sind. Dies funktioniert sowohl für Text- als auch für Binärdateien. Die zweite Möglichkeit besteht darin, mit f.tell() zu prüfen, ob die aktuelle Suchposition am Ende ist. Wenn Sie möchten, dass EOF die aktuelle Dateiposition nicht ändert, benötigen Sie etwas zusätzlichen Code.

Nachfolgend sind beide Implementierungen aufgeführt.

Verwenden der tell () Methode

import os

def is_eof(f):
  cur = f.tell()    # save current position
  f.seek(0, os.SEEK_END)
  end = f.tell()    # find the size of file
  f.seek(cur, os.SEEK_SET)
  return cur == end

Mit read () Methode

def is_eof(f):
  s = f.read(1)
  if s != b'':    # restore position
    f.seek(-1, os.SEEK_CUR)
  return s == b''

Wie man das benutzt

while not is_eof(my_file):
    val = my_file.read(10)

Mit diesem Code spielen .

0
Shital Shah

Obwohl ich persönlich eine with-Anweisung verwenden würde, um das Öffnen und Schließen einer Datei zu behandeln, müssen Sie in dem Fall, in dem Sie von stdin lesen und eine EOF -Ausnahme verfolgen müssen, Folgendes tun:

Verwenden Sie einen try-catch mit EOFError als Ausnahme:

try:
    input_lines = ''
    for line in sys.stdin.readlines():
        input_lines += line             
except EOFError as e:
    print e
0
Blairg23