Wat is de perfecte tegenhanger in Python voor while not EOF

Om een ​​tekstbestand te lezen, in C of Pascal, gebruik ik altijd de volgende fragmenten om de gegevens te lezen tot EOF:

while not eof do begin
  readline(a);
  do_something;
end;

Dus ik vraag me af hoe ik dit eenvoudig en snel kan doen in Python?


Antwoord 1, autoriteit 100%

Loop over het bestand om regels te lezen:

with open('somefile') as openfileobject:
    for line in openfileobject:
        do_something()

Bestandsobjecten zijn itereerbaar en leveren lijnen op tot EOF. Het gebruik van het bestandsobject als een iterable gebruikt een buffer om te zorgen voor performante reads.

U kunt hetzelfde doen met de stdin (u hoeft raw_input() niet te gebruiken:

import sys
for line in sys.stdin:
    do_something()

Om het plaatje compleet te maken, kunnen binaire reads gedaan worden met:

from functools import partial
with open('somefile', 'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read, 1024), b''):
        do_something()

waarbij chunk maximaal 1024 bytes per keer uit het bestand zal bevatten, en de iteratie stopt wanneer openfileobject.read(1024) lege bytetekenreeksen begint terug te geven.

p>


Antwoord 2, autoriteit 32%

Je kunt het C-idioom in Python imiteren.

Om een ​​buffer tot een max_size aantal bytes te lezen, kunt u dit doen:

with open(filename, 'rb') as f:
    while True:
        buf = f.read(max_size)
        if not buf:
            break
        process(buf)

Of een tekstbestand regel voor regel:

# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
    while True:
        line = f.readline()
        if not line:
            break
        process(line)

Je moet een while True / break constructie gebruiken aangezien er geen eof-test in Python behalve het ontbreken van bytes die zijn geretourneerd na een leesbewerking.

In C heb je misschien:

while ((ch != '\n') && (ch != EOF)) {
   // read the next ch and add to a buffer
   // ..
}

U kunt dit echter niet hebben in Python:

 while (line = f.readline()):
     # syntax error

omdat toewijzingen zijn niet toegestaan ​​in expressies in Python (hoewel recente versies van Python dit kunnen nabootsen met behulp van toewijzingsexpressies, zie hieronder).

Het is zeker meer idiomatisch in Python om dit te doen:

# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
    for line in f:
        process(line)

Update: sinds Python 3.8 mag je ook toewijzingsuitdrukkingen:

 while line := f.readline():
     process(line)

Antwoord 3, autoriteit 9%

Het Python-idioom voor het openen van een bestand en het regel voor regel lezen is:

with open('filename') as f:
    for line in f:
        do_something(line)

Het bestand wordt automatisch gesloten aan het einde van de bovenstaande code (de constructie with zorgt daarvoor).

Ten slotte is het vermeldenswaard dat line de laatste nieuwe regel behoudt. Dit kan eenvoudig worden verwijderd met:

line = line.rstrip()

Antwoord 4, autoriteit 6%

U kunt onderstaand codefragment gebruiken om regel voor regel te lezen, tot het einde van het bestand

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

Antwoord 5, autoriteit 5%

Hoewel er hierboven suggesties zijn om “het op de python-manier te doen”, als je echt een logica wilt hebben op basis van EOF, dan veronderstel ik dat het gebruik van uitzonderingsbehandeling de manier is om het te doen —

try:
    line = raw_input()
    ... whatever needs to be done incase of no EOF ...
except EOFError:
    ... whatever needs to be done incase of EOF ...

Voorbeeld:

$ echo test | python -c "while True: print raw_input()"
test
Traceback (most recent call last):
  File "<string>", line 1, in <module> 
EOFError: EOF when reading a line

Of druk op Ctrl-Z bij een raw_input() prompt (Windows, Ctrl-Z Linux)


Antwoord 6

Naast het geweldige antwoord van @dawg, de equivalente oplossing met walrus-operator (Python >= 3.8):

with open(filename, 'rb') as f:
    while buf := f.read(max_size):
        process(buf)

Antwoord 7

U kunt het volgende codefragment gebruiken. readlines() leest het hele bestand tegelijk in en verdeelt het per regel.

line = obj.readlines()

Antwoord 8

Wat dacht je hiervan! Maak het eenvoudig!

for line in open('myfile.txt', 'r'):
    print(line)

Het is niet nodig om extra regels te verspillen. En het is niet nodig om het trefwoord with te gebruiken, omdat het bestand automatisch wordt gesloten als er geen verwijzing naar het bestandsobject is.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

one × 3 =

Other episodes