Yanıtlar:
Satırları okumak için dosya üzerinde döngü yapın:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Dosya nesneleri yinelenebilir ve EOF'ye kadar satırlar üretir. Dosya nesnesini yinelenebilir olarak kullanmak, performant okumaları sağlamak için bir arabellek kullanır.
Aynı şeyi stdin ile de yapabilirsiniz (kullanmaya gerek yoktur raw_input()
:
import sys
for line in sys.stdin:
do_something()
Resmi tamamlamak için ikili okumalar şu şekilde yapılabilir:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
nerede chunk
dosyasından bir defada 1024 bayt kadar tutar ve ne zaman iterasyon durur olacak openfileobject.read(1024)
başlar boş bayt dizeleri dönüyor.
stdin
işlemden okuyorum ... bu yüzden ben süreci sonlandırana kadar EOF'ye sahip değil. Ama sonra "sonuna kadar" varıyorum ve çıkmaza giriyorum. Bunu nasıl tespit ederim ve kilitlenmeyi değil? Yeni satırlar yoksa, dosyaları okumayı bırakın (benim durumumda hiçbir zaman olmayacak bir EOF olmasa bile).
Python'da C deyimini taklit edebilirsiniz.
Bayta kadar tampon okumak için şunu max_size
yapabilirsiniz:
with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if not buf:
break
process(buf)
Veya satır satır bir metin dosyası:
# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
while True:
line = f.readline()
if not line:
break
process(line)
Python'da bir okumadan dönen baytların eksikliği dışında eof testiwhile True / break
olmadığından, yapı kullanmanız gerekir .
C'de, sahip olabilirsiniz:
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
Ancak, Python'da buna sahip olamazsınız:
while (line = f.readline()):
# syntax error
çünkü atamaları ifadelerde izin verilmez Python (Python son sürümleri bu kullanarak atama ifadeleri taklit edebilir, ancak aşağıya bakınız).
Python'da bunu yapmak kesinlikle daha deyimsel:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
Güncelleme: Python 3.8'den beri atama ifadelerini de kullanabilirsiniz :
while line := f.readline():
process(line)
readline()
yolun bir avantajı var gibi görünüyor : UnicodeDecodeError
deyimsel for
yinelemeyle yapamayacağınız yakalama gibi ince taneli hata işlemeyi yapabilirsiniz .
Bir dosyayı açmak ve onu satır satır okumak için kullanılan Python deyimi şöyledir:
with open('filename') as f:
for line in f:
do_something(line)
Yukarıdaki kodun sonunda dosya otomatik olarak kapatılacaktır ( with
yapı bunu halleder).
Son olarak, line
son satır satırını koruyacağını belirtmekte fayda var . Bu, aşağıdakiler kullanılarak kolayca kaldırılabilir:
line = line.rstrip()
for line in f.readlines(): ...
yaygın olarak önerilen çözüm,.
Dosyanın sonuna kadar satır satır okumak için aşağıdaki kod parçacığını kullanabilirsiniz.
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
Yukarıda "python yolu ile yapmak" için öneriler olsa da, biri gerçekten EOF'ye dayalı bir mantığa sahip olmak istiyorsa, o zaman istisna işlemeyi kullanmanın bunu yapmanın yolu olduğunu düşünüyorum -
try:
line = raw_input()
... whatever needs to be done incase of no EOF ...
except EOFError:
... whatever needs to be done incase of EOF ...
Misal:
$ 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
Veya Ctrl-Zbir raw_input()
komut isteminde basın (Windows, Ctrl-ZLinux)
Aşağıdaki kod parçacığını kullanabilirsiniz. readlines () tüm dosyayı bir defada okur ve satıra böler.
line = obj.readlines()
line
Sonunda yeni bir satır karakteri olacaktır.