কেন আমি একটি মুক্ত ফাইলটিতে দুবার রিড () কল করতে পারি না?


100

আমি যে অনুশীলনটি করছি তার জন্য, আমি read()পদ্ধতিটি ব্যবহার করে একটি প্রদত্ত ফাইলের বিষয়বস্তু দু'বার পড়ার চেষ্টা করছি । আশ্চর্যের বিষয় হল, আমি যখন দ্বিতীয়বার কল করি তখন মনে হয় না ফাইলের সামগ্রীটি স্ট্রিং হিসাবে ফেরত দেবে?

এখানে কোড

f = f.open()

# get the year
match = re.search(r'Popularity in (\d+)', f.read())

if match:
  print match.group(1)

# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())

if matches:
  # matches is always None

অবশ্যই আমি জানি যে এটি সর্বাধিক দক্ষ বা সর্বোত্তম উপায় নয়, এখানে এটি বিন্দু নয়। কথাটি হ'ল, কেন আমি read()দু'বার ফোন করতে পারি না ? আমার কি ফাইল হ্যান্ডেলটি পুনরায় সেট করতে হবে? বা ফাইলটি বন্ধ / পুনরায় খুলতে তা করার জন্য?


4
আপনি কোথায় পেলেন যে পড়াটি ফাইলের স্থিতি পরিবর্তন করবে না? আপনি কোন রেফারেন্স বা টিউটোরিয়াল ব্যবহার করছেন?
এস .লট

আমি বিশ্বাস করি যে ফাইলটি বন্ধ করা এবং পুনরায় খোলার নীচের উত্তরগুলির উপর ভিত্তি করে কাজ করা উচিত।
অ্যান্টনি

4
@ শিন্থরিয়ার: ফাইলটি বন্ধ এবং পুনরায় খোলা সর্বদা একটি ভাল ধারণা নয় কারণ এটি সিস্টেমে অন্যান্য প্রভাব থাকতে পারে (অস্থায়ী ফাইলগুলি, ইনক্রোন ইত্যাদি)।
ইগনাসিও ওয়াজকেজ-আব্রামস

4
আমি শুধু সুস্পষ্ট রাষ্ট্র চান: আপনি DID () কলের পঠিত দুইবার!

4
ডাব্লু / আর / টি / এস.লট, এবং 5 বছর থেকে: এটি সত্যই পাইথন ডকুমেন্টেশনে থাকা দরকার। এটি যে স্পষ্টতই অনুমান করা উচিত নয় যে কোনও ফাইল অবজেক্ট পড়লে যে কোনও অবস্থার পরিবর্তন হবে, বিশেষত যদি অপরিবর্তনীয় ডেটা / ক্রিয়ামূলক-স্টাইল প্রোগ্রামিংয়ের সাথে কাজ করার
অভ্যস্ত হয়

উত্তর:


159

কলিং read()পুরো ফাইলের মধ্যে পড়ে এবং ফাইলের শেষে পাঠক কার্সার ছেড়ে দেয় (আরও কিছু পড়ার মতো নেই)। আপনি ব্যবহার করতে পারে আপনি একবারে লাইনের একটি নির্দিষ্ট সংখ্যক পড়া করতে খুঁজছি হয় readline(), readlines()বা বারবার সঙ্গে লাইনের মাধ্যমে for line in handle:

আপনার প্রশ্নের সরাসরি উত্তর দেওয়ার জন্য, একবার ফাইল পড়ার পরে read()আপনি seek(0)ফাইলটি শুরুতে পঠন কার্সারটি ব্যবহার করতে পারেন (ডক্স এখানে রয়েছে )। যদি আপনি জানেন যে ফাইলটি খুব বেশি বড় হতে যাচ্ছে না, আপনি read()এটি আপনার অনুসন্ধানের এক্সপ্রেশনগুলিতে ব্যবহার করে আউটপুটটিকে একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন ।

পুনশ্চ. ফাইলটি সম্পন্ন করার পরে ফাইলটি বন্ধ করতে ভুলবেন না;)


4
+1, হ্যাঁ, অযথা ফাইল I / O এড়াতে দয়া করে অস্থায়ী পরিবর্তনশীল পড়ুন। এটি একটি মিথ্যা অর্থনীতি যা আপনি কোনও স্মৃতি সংরক্ষণ করছেন কারণ আপনার কম (স্পষ্ট) ভেরিয়েবল রয়েছে।
নিক টি

4
@ নিকটি: আমি আশা করব যে একাধিকবার পড়া একটি ছোট ফাইল ওএস (কমপক্ষে লিনাক্স / ওএসএক্স এ) দ্বারা ক্যাশে হয়ে যায়, সুতরাং দ্বিগুণ পড়ার জন্য কোনও অতিরিক্ত ফাইল আই / ও নেই। মেমরির সাথে খাপ খায় না এমন বড় ফাইলগুলি ক্যাশে হয় না, তবে আপনি এগুলি পরিবর্তনশীল হিসাবে পড়তে চান না কারণ আপনি অদলবদল শুরু করবেন। সন্দেহের ক্ষেত্রে তাই সর্বদা একাধিকবার পড়ুন। আপনি যদি ফাইলগুলি ক্ষুদ্রের বিষয়ে নিশ্চিত হয়ে থাকেন তবে সর্বোত্তম প্রোগ্রামটি যা দেয় তা করুন।
ক্লড

4
টিয়ার ডাউন ডাউন দিয়ে অটোমেটেড করা যায় with
সিইস টিমারম্যান

30

হ্যাঁ, উপরে হিসাবে ...

আমি কেবল একটি উদাহরণ লিখব:

>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output

18

এই প্রশ্নের উত্তর এখন পর্যন্ত দেওয়া প্রত্যেকেই একেবারে সঠিক - read()ফাইলটির মধ্য দিয়ে চলে যায়, সুতরাং আপনি যখন এটি কল করার পরে আপনি এটি আবার কল করতে পারবেন না।

আমি যা যুক্ত করব তা হ'ল আপনার বিশেষ ক্ষেত্রে, আপনাকে ফাইলটি আবার শুরু করতে বা পুনরায় খোলার দরকার নেই, আপনি কেবল স্থানীয় ভেরিয়েবেলে যে পাঠ্যটি পড়েছেন তা সংরক্ষণ করতে পারেন এবং এটি দুটিবার ব্যবহার করতে পারেন, বা আপনার প্রোগ্রামে আপনি যতবার চান:

f = f.open()
text = f.read() # read the file into a local variable
# get the year
match = re.search(r'Popularity in (\d+)', text)
if match:
  print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', text)
if matches:
  # matches will now not always be None

4
+1 আসলে এই অনুশীলনের প্রস্তাবিত সমাধান ছিল ( কোড . google.com/intl/de-DE/edu/languages/google-python-class/… )। তবে কোনওভাবেই আমি ভেরিয়েবলটিতে স্ট্রিংটি সংরক্ষণ করার চিন্তা করি নি। ডিওহ!
হেল্পারমেডো

4
পাইথন 3 এর সাথে, পাথলিব ব্যবহার করুন। from pathlib import Path; text = Path(filename).read_text()খোলা, বন্ধ করা ইত্যাদির যত্ন নেয়
PaulMcG

14

শেষ পঠিত বাইট / চরিত্রের পরে পয়েন্ট পয়েন্টার সরানো হয়। seek()শুরুর দিকে পয়েন্ট পয়েন্টারটি রিওয়াইন্ড করতে পদ্ধতিটি ব্যবহার করুন ।


2

প্রতিটি উন্মুক্ত ফাইলের একটি সম্পর্কিত অবস্থান রয়েছে।
আপনি যখন পড়েন () আপনি সেই অবস্থান থেকে পড়েন। উদাহরণস্বরূপ read(10)সদ্য খোলা ফাইল থেকে প্রথম 10 বাইট read(10)পড়ে , এবং অন্যটি পরের 10 বাইট পড়বে। read()যুক্তি ছাড়াই ফাইলের সমস্ত বিষয়বস্তু পড়ে ফাইলের শেষে ফাইলের অবস্থান ছেড়ে যায়। পরের বার আপনি কলread() করলে পড়ার মতো কিছুই নেই।

আপনি seekফাইল অবস্থান সরাতে ব্যবহার করতে পারেন । অথবা আপনার ক্ষেত্রে সম্ভবত এটির চেয়ে ভাল হ'ল read()উভয় অনুসন্ধানের জন্য ফলাফলটি রাখা।


1

read() হ্রাস । সুতরাং, আপনি ফাইলটি পুনরায় সেট করতে পারেন , বা পুনরায় পড়ার আগে শুরু করার চেষ্টা করতে পারেন। অথবা, এটি যদি আপনার কার্য স্যুট করে তবে আপনি read(n)কেবল nবাইট ব্যবহার করতে পারেন ।


1

আমি সবসময় পঠন পদ্ধতিটি একটি অন্ধকার গলি দিয়ে হাঁটার কিছু খুঁজে পাই। আপনি কিছুটা নিচে গিয়ে থামেন তবে আপনি যদি আপনার পদক্ষেপগুলি গণনা না করেন তবে আপনি কতটা দূরে আছেন তা নিশ্চিত নন। সিকটি পুনঃস্থাপনের মাধ্যমে সমাধান দেয়, অন্য বিকল্পটি বলুন যা ফাইলের সাথে অবস্থানটি দেয়। পাইথন ফাইল এপিআই হতে পারে এটি পড়ার একত্রিত করতে এবং এটি আরও সহজ করার জন্য একটি পঠন_প্রেম (অবস্থান, বাইটস) -এ সন্ধান করতে পারে - যতক্ষণ না ঘটে ততক্ষণ আপনার এই পৃষ্ঠাটি পড়া উচিত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.