কিছু পাঠ্য ফাইল পড়তে, সি বা পাস্কেলে, আমি ইওএফ পর্যন্ত ডেটা পড়তে সর্বদা নিম্নলিখিত স্নিপেটগুলি ব্যবহার করি:
while not eof do begin
readline(a);
do_something;
end;
সুতরাং, আমি আশ্চর্য হয়েছি কীভাবে পাইথনে আমি এই সহজ এবং দ্রুত করতে পারি?
কিছু পাঠ্য ফাইল পড়তে, সি বা পাস্কেলে, আমি ইওএফ পর্যন্ত ডেটা পড়তে সর্বদা নিম্নলিখিত স্নিপেটগুলি ব্যবহার করি:
while not eof do begin
readline(a);
do_something;
end;
সুতরাং, আমি আশ্চর্য হয়েছি কীভাবে পাইথনে আমি এই সহজ এবং দ্রুত করতে পারি?
উত্তর:
লাইন পড়তে ফাইলের উপর লুপ করুন:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
ফাইল অবজেক্টগুলি পুনরাবৃত্তিযোগ্য এবং EOF অবধি লাইন উপার্জন করে। পুনরুক্তিযোগ্য হিসাবে ফাইল অবজেক্ট ব্যবহার করা পারফরম্যান্ট রিডগুলি নিশ্চিত করতে একটি বাফার ব্যবহার করে।
আপনি স্টিডিনের সাথেও এটি করতে পারেন (ব্যবহার করার দরকার নেই raw_input()
:
import sys
for line in sys.stdin:
do_something()
ছবিটি সম্পূর্ণ করতে, বাইনারি রিডগুলি দিয়ে করা যেতে পারে:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
যেখানে chunk
ফাইল থেকে একসাথে 1024 বাইট থাকবে এবং openfileobject.read(1024)
খালি বাইট স্ট্রিংগুলি ফিরতে শুরু করলে পুনরাবৃত্তি থামে ।
stdin
একটি চলমান প্রক্রিয়া থেকে একটি থেকে পড়ছি ... সুতরাং আমি প্রক্রিয়াটি না মেরে এটিতে কখনও ইওএফ থাকে না। তবে তারপরে আমি "এখন অবধি এখন" পৌঁছেছি এবং আমি অচল। আমি কীভাবে এটি সনাক্ত করতে পারি এবং অচলাবস্থা নেই? কোনও নতুন লাইন না থাকলে, ফাইলগুলি পড়া বন্ধ করুন (কোনও ইওএফ না থাকলেও, যা আমার ক্ষেত্রে কখনও উপস্থিত থাকবে না)।
আপনি পাইথনের সি আইডিয়মটি অনুকরণ করতে পারেন।
max_size
বাইট সংখ্যা পর্যন্ত একটি বাফার পড়তে , আপনি এটি করতে পারেন:
with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if not buf:
break
process(buf)
বা, একটি পাঠ্য ফাইল লাইন লাইন:
# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
while True:
line = f.readline()
if not line:
break
process(line)
আপনাকে while True / break
কন্সট্রাক্ট ব্যবহার করা দরকার যেহেতু পাইথনে কোনও পড়ার সময় থেকে ফিরে আসা বাইটের অভাব ছাড়া অন্য কোনও ইওফ টেস্ট নেই ।
সি তে, আপনার হতে পারে:
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
তবে পাইথনে আপনার এটি থাকতে পারে না:
while (line = f.readline()):
# syntax error
কারণ বরাদ্দকরণ এক্সপ্রেশন অনুমোদিত নয় পাইথনের (যদিও পাইথনের সাম্প্রতিক সংস্করণগুলি অ্যাসাইনমেন্ট এক্সপ্রেশনগুলি ব্যবহার করে এটি নকল করতে পারে, নীচে দেখুন)।
এটা অবশ্যই আরো পাইথন এই কাজ করার জন্য কথ্য:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
আপডেট: পাইথন ৩.৮ থেকে আপনি অ্যাসাইনমেন্ট এক্সপ্রেশনও ব্যবহার করতে পারেন :
while line := f.readline():
process(line)
readline()
পদ্ধতিতে এটির একটি সুবিধা রয়েছে বলে মনে হচ্ছে : আপনি ধরার মতো সূক্ষ্ম ত্রুটিযুক্ত ত্রুটি পরিচালনা UnicodeDecodeError
করতে পারেন, যা আপনি অহঙ্কারী for
পুনরাবৃত্তির সাথে করতে পারবেন না ।
একটি ফাইল খোলার এবং এটি লাইন বাই লাইন পড়ার পাইথন আইডিয়ামটি হ'ল:
with open('filename') as f:
for line in f:
do_something(line)
উপরের কোডের শেষে ফাইলটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে ( with
কনস্ট্রাক্ট এটির যত্ন নেয়)।
শেষ অবধি, এটি লক্ষণীয় যে এটি line
পূর্ববর্তী নিউলাইনটি সংরক্ষণ করবে। এটি ব্যবহার করে সহজেই সরানো যেতে পারে:
line = line.rstrip()
for line in f.readlines(): ...
, একটি সাধারণভাবে প্রস্তাব সমাধান।
আপনি ফাইল সীমা অবধি লাইনে লাইনে পড়তে কোড স্নিপেট ব্যবহার করতে পারেন
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
"এটি অজগর পথে করার জন্য" উপরে প্রস্তাবনা রয়েছে, তবে কেউ যদি ইওএফ-এর উপর ভিত্তি করে যুক্তি রাখতে চায় তবে আমি মনে করি ব্যতিক্রম হ্যান্ডলিংটিই এটি করার উপায় -
try:
line = raw_input()
... whatever needs to be done incase of no EOF ...
except EOFError:
... whatever needs to be done incase of EOF ...
উদাহরণ:
$ 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
অথবা Ctrl-Zএকটি raw_input()
প্রম্পটে টিপুন (উইন্ডোজ, Ctrl-Zলিনাক্স)
আপনি নিম্নলিখিত কোড স্নিপেট ব্যবহার করতে পারেন। রিডলাইনস () পুরো ফাইলটিতে একবারে পড়ে এবং লাইনে ভাগ করে দেয়।
line = obj.readlines()
line
শেষে একটি নতুন লাইনের অক্ষর থাকবে।