পাইথনের ফাইলের প্রতিটি লাইন কীভাবে পড়ব এবং প্রতিটি লাইনকে একটি তালিকার উপাদান হিসাবে সংরক্ষণ করব?
আমি লাইন দ্বারা ফাইল লাইনটি পড়তে এবং প্রতিটি লাইনের তালিকার শেষে যুক্ত করতে চাই।
পাইথনের ফাইলের প্রতিটি লাইন কীভাবে পড়ব এবং প্রতিটি লাইনকে একটি তালিকার উপাদান হিসাবে সংরক্ষণ করব?
আমি লাইন দ্বারা ফাইল লাইনটি পড়তে এবং প্রতিটি লাইনের তালিকার শেষে যুক্ত করতে চাই।
উত্তর:
with open(filename) as f:
content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]
readlines()
কাজ করছেন তা খুব কার্যকর নয় কারণ এটি মেমোরিআরারের ফলে তৈরি হতে পারে । এক্ষেত্রে for line in f:
প্রতিটি line
ভেরিয়েবল ব্যবহার করে এবং কাজ করে ফাইলে পুনরাবৃত্তি করা ভাল ।
.rstrip()
আপনি যদি লাইনের শেষ প্রান্ত থেকে হোয়াইটস্পেস সরিয়ে নিচ্ছেন তবে কিছুটা দ্রুত কাজ করবে।
দেখুন ইনপুট এবং Ouput :
with open('filename') as f:
lines = f.readlines()
অথবা নিউলাইন চরিত্রটি কেটে ফেলা সহ:
with open('filename') as f:
lines = [line.rstrip() for line in f]
f.read().splitlines()
যা নতুনলাইনগুলি সরিয়ে দেয়
for line in open(filename)
নিরাপদ? অর্থাৎ ফাইলটি কি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে?
lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]
আমি যদি এভাবে লিখি, পড়ার পরে কীভাবে ফাইলটি বন্ধ করব?
open
কনটেক্সট ম্যানেজার ছাড়া এটি ব্যবহার করা "সেরা অনুশীলন" নয় (বা এটি বন্ধ করার জন্য কোনও গ্যারান্টিযুক্ত উপায়), এটি সত্যিকার অর্থে এর মধ্যে একটি নয় - যখন বস্তুর আর কোনও উল্লেখ নেই when এটিতে আবর্জনা সংগ্রহ করা হবে এবং ফাইলটি বন্ধ হয়ে যাবে, যা তাত্ক্ষণিকভাবে ত্রুটির সাথে ঘটবে বা না হওয়া উচিত, যখন তালিকাটি বোঝার প্রক্রিয়া সম্পন্ন হবে।
এটি প্রয়োজনের তুলনায় আরও স্পষ্ট, তবে আপনি যা চান তা করে।
with open("file.txt") as file_in:
lines = []
for line in file_in:
lines.append(line)
array
যদিও সংযোজন করা হয়েছে তবে অন্য পরিস্থিতিতেও থাকতে পারে)। অবশ্যই বড় ফাইলগুলির জন্য এই পদ্ধতির সমস্যা হ্রাস হতে পারে।
এটি ফাইল থেকে লাইনগুলির একটি "অ্যারে" উপস্থাপন করবে।
lines = tuple(open(filename, 'r'))
open
একটি ফাইল ফেরত দেয় যা পুনরাবৃত্তি হতে পারে। আপনি যখন কোনও ফাইলের উপরে পুনরাবৃত্তি করেন, আপনি সেই ফাইলটি থেকে লাইনগুলি পান। tuple
একটি পুনরাবৃত্তি গ্রহণ করতে পারে এবং আপনি এটির যে পুনরাবৃত্তিটি দিয়ে থাকেন তা থেকে আপনার জন্য একটি দ্বৈত উদাহরণ ইনস্ট্যান্ট করতে পারে। lines
ফাইলের লাইন থেকে তৈরি একটি টুপল।
lines = open(filename).read().split('\n')
পরিবর্তে মার্শালফারিয়ার চেষ্টা করুন
lines = open(filename).read().splitlines()
একটু ক্লিনার পেয়েছি এবং আমি বিশ্বাস করি এটি ডস লাইন শেষগুলি আরও ভালভাবে পরিচালনা করে।
list
চেয়ে 13.22% বেশি স্থান নেয় tuple
। ফলাফল আসে from sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2)
। একটি তৈরির tuple
তুলনায় একটি list
(0.16% স্ট্যান্ডার্ড বিচ্যুতি সহ) তৈরির ক্ষেত্রে প্রায় 4.17% বেশি সময় লাগে । from timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2)
30 বার চালানো থেকে ফলাফল আসে । আমার সমাধানটি যখন গতিশীলতার প্রয়োজনীয়তা অপরিচিত তখন গতির চেয়ে বেশি স্থানের পক্ষে।
আপনি যদি \n
অন্তর্ভুক্ত চান :
with open(fname) as f:
content = f.readlines()
আপনি যদি \n
অন্তর্ভুক্ত না চান :
with open(fname) as f:
content = f.read().splitlines()
পাইথনের ফাইল অবজেক্টের পদ্ধতি অনুসারে কোনও পাঠ্য ফাইলকে একটিতে রূপান্তর করার সহজ উপায় list
হ'ল:
with open('file.txt') as f:
my_list = list(f)
আপনার যদি কেবল পাঠ্য ফাইলের লাইনগুলিতে পুনরাবৃত্তি করতে হয় তবে আপনি ব্যবহার করতে পারেন:
with open('file.txt') as f:
for line in f:
...
পুরানো উত্তর:
ব্যবহার with
এবং readlines()
:
with open('file.txt') as f:
lines = f.readlines()
আপনি যদি ফাইলটি বন্ধ করার বিষয়ে চিন্তা না করেন তবে এই ওয়ান-লাইনারটি কাজ করে:
lines = open('file.txt').readlines()
ঐতিহ্যগত ভাবে:
f = open('file.txt') # Open file on read mode
lines = f.read().split("\n") # Create a list containing all lines
f.close() # Close file
প্রস্তাবিত হিসাবে আপনি কেবল নিম্নলিখিতটি করতে পারেন:
with open('/your/path/file') as f:
my_lines = f.readlines()
মনে রাখবেন যে এই পদ্ধতির 2 টি ডাউনসাইড রয়েছে:
1) আপনি সমস্ত লাইন স্মৃতিতে সঞ্চয় করেন। সাধারণ ক্ষেত্রে এটি খুব খারাপ ধারণা idea ফাইলটি খুব বড় হতে পারে এবং আপনার স্মৃতিশক্তি শেষ হয়ে যেতে পারে। এটি বড় না হলেও এটি কেবল স্মৃতির অপচয়।
2) এটি প্রতিটি লাইনের পড়ার সাথে সাথে প্রক্রিয়া করার অনুমতি দেয় না। সুতরাং এর পরে যদি আপনি আপনার লাইনগুলি প্রক্রিয়া করেন তবে এটি কার্যকর নয় (একের চেয়ে দুটি পাসের প্রয়োজন)।
সাধারণ ক্ষেত্রে আরও ভাল পন্থা নিম্নলিখিত হবে:
with open('/your/path/file') as f:
for line in f:
process(line)
যেখানে আপনি আপনার প্রক্রিয়াটি যেভাবে চান তার কার্যকারিতা সংজ্ঞায়িত করেন। উদাহরণ স্বরূপ:
def process(line):
if 'save the world' in line.lower():
superman.save_the_world()
(বাস্তবায়ন Superman
ক্লাসের আপনার জন্য অনুশীলন হিসাবে ছেড়ে গেছে)।
এটি যে কোনও ফাইল আকারের জন্য দুর্দান্তভাবে কাজ করবে এবং আপনি নিজের ফাইলটি দিয়ে যান মাত্র 1 পাসে। জেনেরিক পার্সাররা কীভাবে কাজ করবে এটি সাধারণত এটি।
open('file_path', 'r+')
তালিকায় তথ্য
অনুমান করুন যে আমাদের নিম্নোক্ত লাইনের মতো আমাদের ডেটা সহ একটি পাঠ্য ফাইল রয়েছে,
পাঠ্য ফাইল সামগ্রী:
line 1
line 2
line 3
python
এবং দোভাষী লিখুন:পাইথন লিপি:
>>> with open("myfile.txt", encoding="utf-8") as file:
... x = [l.strip() for l in file]
>>> x
['line 1','line 2','line 3']
অ্যাপেন্ড ব্যবহার করুন:
x = []
with open("myfile.txt") as file:
for l in file:
x.append(l.strip())
বা:
>>> x = open("myfile.txt").read().splitlines()
>>> x
['line 1', 'line 2', 'line 3']
বা:
>>> x = open("myfile.txt").readlines()
>>> x
['linea 1\n', 'line 2\n', 'line 3\n']
বা:
>>> y = [x.rstrip() for x in open("my_file.txt")]
>>> y
['line 1','line 2','line 3']
with open('testodiprova.txt', 'r', encoding='utf-8') as file:
file = file.read().splitlines()
print(file)
with open('testodiprova.txt', 'r', encoding='utf-8') as file:
file = file.readlines()
print(file)
encoding="utf-8"
প্রয়োজনীয়?
read().splitlines()
পাইথন আপনাকে সরবরাহ করে: এটি কেবল readlines()
(যা সম্ভবত দ্রুত, এটি কম অপচয় হিসাবে)।
একটি তালিকায় একটি ফাইল পড়তে আপনাকে তিনটি জিনিস করতে হবে:
ভাগ্যক্রমে পাইথন এই জিনিসগুলি করা খুব সহজ করে তোলে তাই কোনও তালিকার মধ্যে ফাইল পড়ার সবচেয়ে সংক্ষিপ্ততম উপায় হ'ল:
lst = list(open(filename))
তবে আমি আরও কিছু ব্যাখ্যা যুক্ত করব।
আমি ধরে নিলাম যে আপনি একটি নির্দিষ্ট ফাইল খুলতে চান এবং আপনি সরাসরি কোনও ফাইল-হ্যান্ডেল (বা কোনও ফাইলের মতো হ্যান্ডেল) দিয়ে ডিল করেন না। পাইথনে ফাইল খুলতে সর্বাধিক ব্যবহৃত ফাংশনটি হ'ল open
পাইথন ২.7 এ একটি বাধ্যতামূলক আর্গুমেন্ট এবং দুটি alচ্ছিক প্রয়োজন:
ফাইলের নামটি এমন একটি স্ট্রিং হওয়া উচিত যা ফাইলের পথে প্রতিনিধিত্ব করে । উদাহরণ স্বরূপ:
open('afile') # opens the file named afile in the current working directory
open('adir/afile') # relative path (relative to the current working directory)
open('C:/users/aname/afile') # absolute path (windows)
open('/usr/local/afile') # absolute path (linux)
নোট করুন যে ফাইল এক্সটেনশান নির্দিষ্ট করা প্রয়োজন। এটি উইন্ডোজ ব্যবহারকারীদের জন্য বিশেষত গুরুত্বপূর্ণ কারণ ফাইল এক্সটেনশনগুলি .txt
বা .doc
ইত্যাদি ইত্যাদি ডিফল্টরূপে লুকানো থাকে যখন এক্সপ্লোরার দেখা যাবে।
দ্বিতীয় যুক্তি হ'ল mode
, এটিr
ডিফল্টর অর্থ যার অর্থ "কেবলমাত্র পঠনযোগ্য"। আপনার ক্ষেত্রে ঠিক এটি আপনার প্রয়োজন।
তবে আপনি যদি আসলে একটি ফাইল তৈরি করতে চান এবং / অথবা কোনও ফাইল লিখতে চান তবে আপনার এখানে আলাদা যুক্তি প্রয়োজন। যদি আপনি একটি ওভারভিউ চান তবে একটি দুর্দান্ত উত্তর রয়েছে ।
একটি ফাইল পড়ার জন্য আপনি mode
এটিকে বাদ দিতে পারেন বা স্পষ্টভাবে এটি পাস করতে পারেন :
open(filename)
open(filename, 'r')
উভয়ই কেবল পঠন মোডে ফাইলটি খুলবে। আপনি যদি উইন্ডোজে বাইনারি ফাইলটিতে পড়তে চান তবে আপনার মোডটি ব্যবহার করতে হবে rb
:
open(filename, 'rb')
অন্যান্য প্ল্যাটফর্মগুলিতে 'b'
(বাইনারি মোড) সহজভাবে উপেক্ষা করা হয়।
এখন যেভাবে আমি open
ফাইলটি দেখিয়েছি , আসুন আপনার সর্বদা যা প্রয়োজন তা নিয়ে কথা বলুনclose
আবার এটি । অন্যথায় এটি প্রক্রিয়াটি শেষ না হওয়া অবধি ফাইলটিতে একটি খোলা ফাইল-হ্যান্ডেল রাখবে (বা পাইথন ফাইল-হ্যান্ডেলকে ব্যর্থ করে)।
আপনি যখন ব্যবহার করতে পারেন:
f = open(filename)
# ... do stuff with f
f.close()
যে যখন মধ্যবর্তী কিছু ফাইল বন্ধ করতে ব্যর্থ হবে open
এবং close
একটি ব্যতিক্রম ছোঁড়ার। আপনি try
এবং একটি ব্যবহার করে তা এড়াতে পারবেন finally
:
f = open(filename)
# nothing in between!
try:
# do stuff with f
finally:
f.close()
তবে পাইথন প্রাসঙ্গিক ম্যানেজারগুলিকে সরবরাহ করে যাগুলির একটি প্রিন্টিয়ার সিনট্যাক্স রয়েছে (তবে open
এটির জন্য এটি উপরের try
এবং এর finally
চেয়ে প্রায় অনুরূপ ):
with open(filename) as f:
# do stuff with f
# The file is always closed after the with-scope ends.
পাইথনে একটি ফাইল খোলার জন্য সর্বশেষ পদ্ধতির প্রস্তাবিত পন্থা!
ঠিক আছে, আপনি ফাইলটি ওপেন করেছেন, এখন এটি কীভাবে পড়বেন?
open
ফাংশন একটি ফেরৎ file
বস্তু এবং এটি অজগর পুনরাবৃত্তির প্রোটোকল সমর্থন করে। প্রতিটি পুনরাবৃত্তি আপনাকে একটি লাইন দেবে:
with open(filename) as f:
for line in f:
print(line)
এটি ফাইলের প্রতিটি লাইন প্রিন্ট করবে। তবে নোট করুন যে প্রতিটি লাইনের \n
শেষে একটি নিউলাইন অক্ষর থাকবে (আপনি যদি দেখতে চান যে আপনার পাইথন সর্বজনীন নিউলাইন সমর্থন দ্বারা নির্মিত কিনা - অন্যথায় আপনার \r\n
উইন্ডোতে বা ম্যাকেও নিউলাইন হিসাবে থাকতে পারে \r
)। আপনি যদি না চান যে আপনি কেবল সর্বশেষ অক্ষরটি (বা উইন্ডোজের শেষ দুটি অক্ষর) সরাতে পারেন:
with open(filename) as f:
for line in f:
print(line[:-1])
তবে শেষ লাইনে অবিচ্ছিন্নভাবে একটি নতুন লাইনের উপস্থিতি নেই, তাই এটি ব্যবহার করা উচিত নয়। এটি কোনও শেষের লাইনের সাথে শেষ হয়ে গেছে কিনা তা পরীক্ষা করতে পারে এবং যদি এটি মুছে ফেলা হয়:
with open(filename) as f:
for line in f:
if line.endswith('\n'):
line = line[:-1]
print(line)
তবে আপনি স্ট্রিংয়ের শেষে\n
থেকে সমস্ত অক্ষরগুলি ( চরিত্র সহ ) সরিয়ে ফেলতে পারবেন, এটি অন্যান্য সমস্ত ট্র্যাকিং হোয়াইটস্পেসগুলিও সরিয়ে ফেলবে তাই এগুলি গুরুত্বপূর্ণ হলে আপনার যত্নবান হতে হবে:
with open(filename) as f:
for line in f:
print(f.rstrip())
তবে যদি লাইনগুলি \r\n
(উইন্ডোজ "নিউলাইনস") এর সাথে শেষ হয় তবে .rstrip()
এটিও যত্ন নেবে \r
!
এখন আপনি কীভাবে ফাইলটি খুলতে এবং পড়তে জানেন তা এখন তালিকায় বিষয়বস্তু সংরক্ষণের সময়। সহজ বিকল্পটি হ'ল list
ফাংশনটি ব্যবহার করা :
with open(filename) as f:
lst = list(f)
আপনি যদি নতুন ট্র্যাকিংগুলি অনুসরণ করতে চান তবে আপনি পরিবর্তে একটি তালিকা উপলব্ধি ব্যবহার করতে পারেন:
with open(filename) as f:
lst = [line.rstrip() for line in f]
বা এমনকি সহজ: ডিফল্টরূপে অবজেক্টের .readlines()
পদ্ধতিটি file
একটি list
লাইনের ফেরত দেয়:
with open(filename) as f:
lst = f.readlines()
[line.rstrip() for line in f]
এটিতে ট্রিলিং করা নিউলাইন চরিত্রগুলিও অন্তর্ভুক্ত থাকবে, আপনি যদি এগুলি না চান তবে আমি পদ্ধতির প্রস্তাব করব কারণ এটি মেমরির সমস্ত লাইন সম্বলিত দুটি তালিকা রাখা এড়ানো যায়।
পছন্দসই আউটপুট পাওয়ার জন্য অতিরিক্ত বিকল্প রয়েছে, তবে এটি "সাবপটিমাল": read
স্ট্রিংয়ে সম্পূর্ণ ফাইল এবং তারপরে নতুন লাইনে বিভক্ত:
with open(filename) as f:
lst = f.read().split('\n')
বা:
with open(filename) as f:
lst = f.read().splitlines()
এগুলি স্বয়ংক্রিয়ভাবে চলমান নতুন লাইনের যত্ন নেয় কারণ split
চরিত্রটি অন্তর্ভুক্ত নয়। তবে এগুলি আদর্শ নয় কারণ আপনি ফাইলটি স্ট্রিং হিসাবে এবং মেমরির রেখার তালিকা হিসাবে রাখেন!
with open(...) as f
ফাইলগুলি খোলার সময় ব্যবহার করুন কারণ আপনার নিজেরাই ফাইলটি বন্ধ করার যত্ন নেওয়ার প্রয়োজন নেই এবং কিছু ব্যতিক্রম ঘটে গেলেও এটি ফাইলটি বন্ধ করে দেয়।file
অবজেক্টগুলি পুনরাবৃত্তির প্রোটোকল সমর্থন করে সুতরাং একটি ফাইল লাইন বাই লাইন পড়া যতটা সহজ for line in the_file_object:
।readlines()
তবে আপনি যদি তালিকাটিতে স্টোর করার আগে লাইনগুলি প্রসেস করতে চান তবে আমি একটি সহজ তালিকা-বোধগম্যতার প্রস্তাব দিই।একটি তালিকাতে একটি ফাইলের লাইনগুলি পড়ার পরিষ্কার এবং পাইথোনিক উপায়
প্রথম এবং সর্বাগ্রে, আপনার ফাইলটি খোলার এবং এর বিষয়বস্তুগুলি দক্ষ এবং অজগর উপায়ে পড়াতে আপনার দৃষ্টি নিবদ্ধ করা উচিত। আমি ব্যক্তিগতভাবে যেভাবে পছন্দ করি না তার উদাহরণ এখানে:
infile = open('my_file.txt', 'r') # Open the file for reading.
data = infile.read() # Read the contents of the file.
infile.close() # Close the file since we're done using it.
পরিবর্তে, আমি উভয় পড়া এবং লেখার জন্য ফাইলগুলি খোলার নীচের পদ্ধতিটি পছন্দ করি কারণ এটি খুব পরিষ্কার, এবং একবার ফাইলটি ব্যবহার করার পরে এটি বন্ধ করার কোনও অতিরিক্ত পদক্ষেপের প্রয়োজন হবে না। নীচের বিবৃতিতে, আমরা পড়ার জন্য ফাইলটি খুলছি, এবং এটি ভেরিয়েবলকে 'ইনফাইলে' বরাদ্দ করছি। এই বিবৃতিতে কোডটি চলমান শেষ হয়ে গেলে ফাইলটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।
# Open the file for reading.
with open('my_file.txt', 'r') as infile:
data = infile.read() # Read the contents of the file into memory.
পাইথন তালিকায় এই ডেটা আনতে এখন আমাদের ফোকাস করা উচিত কারণ এগুলি পুনরাবৃত্তিযোগ্য, দক্ষ এবং নমনীয়। আপনার ক্ষেত্রে, পাঠ্য ফাইলের প্রতিটি লাইন একটি পৃথক উপাদানের মধ্যে আনাই কাঙ্ক্ষিত লক্ষ্য। এটি সম্পাদন করার জন্য, আমরা স্প্লিটলাইনগুলি () পদ্ধতিটি নিম্নলিখিতভাবে ব্যবহার করব:
# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
চূড়ান্ত পণ্য:
# Open the file for reading.
with open('my_file.txt', 'r') as infile:
data = infile.read() # Read the contents of the file into memory.
# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
আমাদের কোড পরীক্ষা করা:
A fost odatã ca-n povesti,
A fost ca niciodatã,
Din rude mãri împãrãtesti,
O prea frumoasã fatã.
print my_list # Print the list.
# Print each line in the list.
for line in my_list:
print line
# Print the fourth element in this list.
print my_list[3]
['A fost odat\xc3\xa3 ca-n povesti,', 'A fost ca niciodat\xc3\xa3,',
'Din rude m\xc3\xa3ri \xc3\xaemp\xc3\xa3r\xc3\xa3testi,', 'O prea
frumoas\xc3\xa3 fat\xc3\xa3.']
A fost odatã ca-n povesti, A fost ca niciodatã, Din rude mãri
împãrãtesti, O prea frumoasã fatã.
O prea frumoasã fatã.
পাইথন ৩.৪-তে উপস্থাপিত হয়েছে, pathlib
ফাইলগুলি থেকে পাঠ্য পাঠ করার জন্য খুব সুবিধাজনক পদ্ধতি রয়েছে, যা নীচে:
from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()
( splitlines
কলটি সেটিকে ফাইলের সমস্ত বিষয়বস্তুযুক্ত স্ট্রিং থেকে ফাইলের রেখার তালিকায় পরিণত করে)।
pathlib
এতে প্রচুর সুবিধাজনক সুযোগ রয়েছে। read_text
সুন্দর এবং সংক্ষিপ্ত, এবং আপনাকে ফাইলটি খোলার এবং বন্ধ করার বিষয়ে চিন্তা করতে হবে না। আপনার ফাইলটি যা করার দরকার তা যদি সমস্ত একসাথে পড়তে হয় তবে এটি একটি ভাল পছন্দ।
ফাইলগুলিতে তালিকা বোঝার ব্যবহার করে এখানে আরও একটি বিকল্প রয়েছে;
lines = [line.rstrip() for line in open('file.txt')]
পাইথন ইন্টারপ্রেটারের বেশিরভাগ কাজ সম্পন্ন হওয়ায় এটি আরও কার্যকর উপায় হওয়া উচিত।
rstrip()
সম্ভাব্যভাবে সমস্ত পেছনের শ্বেতক্ষেত্রগুলি সরিয়ে দেয়, কেবলমাত্র নয় \n
; ব্যবহার .rstrip('\n')
।
পাইথন 2 এবং পাইথন 3 সহ পাঠ্য ফাইলগুলি পড়ুন এবং লিখুন; এটি ইউনিকোডের সাথে কাজ করে
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Define data
lines = [' A first string ',
'A Unicode sample: €',
'German: äöüß']
# Write text file
with open('file.txt', 'w') as fp:
fp.write('\n'.join(lines))
# Read text file
with open('file.txt', 'r') as fp:
read_lines = fp.readlines()
read_lines = [line.rstrip('\n') for line in read_lines]
print(lines == read_lines)
লক্ষ্য করার বিষয়গুলি:
with
একটি তথাকথিত প্রসঙ্গ পরিচালক । এটি নিশ্চিত করে যে খোলা ফাইলটি আবার বন্ধ হয়েছে।.strip()
বা .rstrip()
ব্যর্থ হবে lines
।সাধারণ ফাইল সমাপ্তি
.txt
আরও উন্নত ফাইল রাইটিং / পড়া
আপনার প্রয়োগের জন্য, নিম্নলিখিতগুলি গুরুত্বপূর্ণ হতে পারে:
আরও দেখুন: ডেটা সিরিয়ালাইজেশন ফর্ম্যাটগুলির তুলনা
আপনি যদি কনফিগারেশন ফাইলগুলি তৈরির পরিবর্তে কোনও উপায় খুঁজছেন তবে আপনি পাইথনে আমার সংক্ষিপ্ত নিবন্ধ কনফিগারেশন ফাইলগুলি পড়তে চাইতে পারেন ।
অন্য একটি বিকল্প numpy.genfromtxt
উদাহরণস্বরূপ:
import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")
এটি data
আপনার ফাইলে যতগুলি সারি রয়েছে তার সাথে একটি নুমপি অ্যারে তৈরি করবে ।
আপনি যদি কমান্ড লাইন থেকে বা স্টিডিনের কোনও ফাইল পড়তে চান তবে আপনি মডিউলটিও ব্যবহার করতে পারেন fileinput
:
# reader.py
import fileinput
content = []
for line in fileinput.input():
content.append(line.strip())
fileinput.close()
এটিতে ফাইলগুলি পাস করুন:
$ python reader.py textfile.txt
এখানে আরও পড়ুন: http://docs.python.org/2/library/fileinput.html
এটি করার সহজ উপায়
একটি সহজ উপায়:
এক লাইনে, এটি দেবে:
lines = open('C:/path/file.txt').read().splitlines()
যাইহোক, এটি বেশ অযোগ্য উপায় কারণ এটি মেমরিতে 2 টি সামগ্রীর সংস্করণ সংরক্ষণ করবে (ছোট ফাইলগুলির জন্য সম্ভবত এটি কোনও বড় সমস্যা নয় তবে এখনও)। [ধন্যবাদ মার্ক আমেরি]।
আরও দুটি সহজ উপায় রয়েছে:
lines = list(open('C:/path/file.txt'))
# ... or if you want to have a list without EOL characters
lines = [l.rstrip() for l in open('C:/path/file.txt')]
pathlib
করেন তবে আপনার ফাইলের জন্য এমন একটি পথ তৈরির জন্য আরও ভাল ব্যবহার করুন যা আপনি আপনার প্রোগ্রামের অন্যান্য ক্রিয়াকলাপের জন্য ব্যবহার করতে পারেন:from pathlib import Path
file_path = Path("C:/path/file.txt")
lines = file_path.read_text().split_lines()
# ... or ...
lines = [l.rstrip() for l in file_path.open()]
.read().splitlines()
করা কেবল কল করার চেয়ে কোনওভাবেই "সরল" নয় .readlines()
। অন্যের জন্য, এটি স্মৃতি-অদক্ষ; আপনি অযথা ফাইলের দুটি সংস্করণ (একক স্ট্রিং দ্বারা ফিরে .read()
আসা স্ট্রিংগুলির তালিকা splitlines()
) মেমোরিতে একবারে সংরক্ষণ করছেন।
কেবল স্প্লিটলাইনগুলি () ফাংশন ব্যবহার করুন। এখানে একটি উদাহরণ।
inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3
আউটপুটে আপনার লাইনের তালিকা থাকবে।
.readlines()
। এটি ফাইল কন্টেন্টের দুটি অনুলিপি একবারে মেমোরিতে রাখে (একক বিশাল স্ট্রিং হিসাবে একটি, লাইনের তালিকার জন্য একটি)।
আপনি যদি খুব বড় / বিশাল ফাইলের মুখোমুখি হতে চান এবং দ্রুত পড়তে চান (কল্পনা করুন যে আপনি টপকোডার / হ্যাকারংকঙ্ক কোডিং প্রতিযোগিতায় রয়েছেন), আপনি হয়ত একবারে স্মৃতি বাফারে লাইনগুলির একটি বড় অংশ পড়তে পারেন, তার চেয়ে বরং ফাইল স্তরে লাইন দ্বারা কেবল পুনরাবৃত্তি করুন।
buffersize = 2**16
with open(path) as f:
while True:
lines_buffer = f.readlines(buffersize)
if not lines_buffer:
break
for line in lines_buffer:
process(line)
process(line)
ডেটা প্রক্রিয়া করার জন্য আপনার এমন একটি ফাংশন যা প্রয়োগ করতে হবে। উদাহরণস্বরূপ, সেই রেখার পরিবর্তে, আপনি যদি ব্যবহার করেন তবে print(line)
এটি প্রতিটি লাইনটি লাইন_বাফার থেকে মুদ্রণ করবে।
lines = list(open('filename'))
অথবা
lines = tuple(open('filename'))
অথবা
lines = set(open('filename'))
ক্ষেত্রে ক্ষেত্রে set
, আমাদের অবশ্যই মনে রাখতে হবে যে আমাদের কাছে লাইন অর্ডার সংরক্ষণ করা নেই এবং নকল করা লাইনগুলি থেকে মুক্তি পেতে পারি।
যেহেতু আপনি
.close
ফাইল অবজেক্টে কল করছেন না বা একটিwith
বিবৃতি ব্যবহার করছেন না তাই কিছু পাইথন বাস্তবায়নে ফাইল পড়ার পরে ফাইলটি বন্ধ না হতে পারে এবং আপনার প্রক্রিয়াটি একটি উন্মুক্ত ফাইল হ্যান্ডেল ফাঁস করবে ।ইন CPython (স্বাভাবিক পাইথন বাস্তবায়ন যে অধিকাংশ লোক ব্যবহার করুন), এই একটা সমস্যা থেকে ফাইল বস্তুর অবিলম্বে আবর্জনা-সংগৃহীত পাবেন এবং এই ফাইলটি বন্ধ হয়ে যাবে না, কিন্তু এটা তবু সাধারণভাবে ভালো কিছু করতে সেরা অনুশীলনের বিবেচিত হচ্ছে :
with open('filename') as f: lines = list(f)
আপনি যে পাইথন প্রয়োগ করছেন তা নির্বিশেষে ফাইলটি বন্ধ হয়ে যায় তা নিশ্চিত করতে ।
.close
ফাইল অবজেক্টে কল করছেন না বা একটি with
বিবৃতি ব্যবহার করছেন না তাই কিছু পাইথন বাস্তবায়নে ফাইল পড়ার পরে ফাইলটি বন্ধ না হতে পারে এবং আপনার প্রক্রিয়াটি একটি উন্মুক্ত ফাইল হ্যান্ডেল ফাঁস করবে। সিপিথনে (সাধারণ পাইথন বাস্তবায়ন যা বেশিরভাগ লোকেরা ব্যবহার করেন), এটি কোনও সমস্যা নয় যেহেতু ফাইল অবজেক্টটি তাত্ক্ষণিকভাবে আবর্জনা সংগ্রহ করবে এবং এটি ফাইলটি বন্ধ হয়ে যাবে, তবে এটি সাধারণত এটি with open('filename') as f: lines = list(f)
নিশ্চিত করার মতো কিছু করার সর্বোত্তম অনুশীলন হিসাবে বিবেচিত হয় পাইথন প্রয়োগ আপনি ব্যবহার করছেন তা বিবেচনা না করেই ফাইলটি বন্ধ হয়ে যায়।
এটা ব্যবহার কর:
import pandas as pd
data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc.
array = data.values
data
এটি একটি ডেটাফ্রেম টাইপ, এবং ন্যাডারে পেতে মানগুলি ব্যবহার করে। আপনি ব্যবহার করে একটি তালিকা পেতে পারেন array.tolist()
।
pandas.read_csv()
সিএসভি ডেটা পড়ার জন্য , এখানে এটি কীভাবে উপযুক্ত?
একটি দিয়ে filename
, কোনও Path(filename)
অবজেক্ট থেকে ফাইল হ্যান্ডলিং করতে বা সরাসরি open(filename) as f
এর সাহায্যে নীচের একটি করুন:
list(fileinput.input(filename))
with path.open() as f
, কলf.readlines()
list(f)
path.read_text().splitlines()
path.read_text().splitlines(keepends=True)
fileinput.input
বা f
এবং list.append
একটি সময়ে প্রতিটি লাইনে একটিf
একটি আবদ্ধ list.extend
পদ্ধতিতে পাসf
একটি তালিকা বোধগম্য ব্যবহার করুনআমি নীচের প্রতিটি জন্য ব্যবহারের কেস ব্যাখ্যা।
পাইথনে, আমি কীভাবে ফাইল-লাইন-লাইন পড়ি?
এটি একটি চমৎকার প্রশ্ন। প্রথমে কিছু নমুনা ডেটা তৈরি করা যাক:
from pathlib import Path
Path('filename').write_text('foo\nbar\nbaz')
ফাইল অবজেক্টগুলি অলস পুনরাবৃত্তকারী, সুতরাং এটির উপরে কেবল পুনরাবৃত্তি করুন।
filename = 'filename'
with open(filename) as f:
for line in f:
line # do something with the line
বিকল্পভাবে, যদি আপনার একাধিক ফাইল থাকে, তবে fileinput.input
অন্য অলস পুনরুদ্ধারকারী ব্যবহার করুন । একটি মাত্র ফাইল সহ:
import fileinput
for line in fileinput.input(filename):
line # process the line
বা একাধিক ফাইলের জন্য, এটি ফাইলের নামের একটি তালিকা পাস করুন:
for line in fileinput.input([filename]*2):
line # process the line
আবার f
এবং fileinput.input
সর্বোপরি উভয়ই / প্রত্যাবর্তন অলস পুনরাবৃত্তি রয়েছে। আপনি কেবল একবারে পুনরাবৃত্তিকারী ব্যবহার করতে পারেন, তাই ভারবোসিটি এড়িয়ে চলাকালীন কার্যকরী কোড সরবরাহ করতে আমি fileinput.input(filename)
এখান থেকে এপ্রোপসকে আরও কিছুটা ক্ষুদ্রতর ব্যবহার করব ।
পাইথনে, আমি কীভাবে একটি তালিকাতে ফাইল লাইন বাই লাইন পড়ব ?
আহ তবে আপনি কোনও কারণে এটি তালিকায় চান? আমি যদি সম্ভব হয় তা এড়াতে চাই। কিন্তু আপনি যদি জিদ ... শুধু ফল পাস fileinput.input(filename)
করার list
:
list(fileinput.input(filename))
আর একটি প্রত্যক্ষ উত্তর হ'ল কল f.readlines
, যা ফাইলের বিষয়বস্তু ফেরত দেয় ( hint
অক্ষরের একটি number চ্ছিক সংখ্যা পর্যন্ত, যাতে আপনি এটিকে একাধিক তালিকায় বিভক্ত করতে পারেন )।
আপনি এই ফাইলটি দুটি উপায়ে যেতে পারেন। একটি উপায় হ'ল open
বিল্টিনে ফাইলের নামটি পাঠানো :
filename = 'filename'
with open(filename) as f:
f.readlines()
বা pathlib
মডিউলটি থেকে নতুন পাথ অবজেক্টটি ব্যবহার করুন (যা আমি বেশ পছন্দ করেছি এবং এখান থেকে ব্যবহার করব):
from pathlib import Path
path = Path(filename)
with path.open() as f:
f.readlines()
list
ফাইল পুনরাবৃত্তকারীকে গ্রাস করবে এবং একটি তালিকা ফেরত দেবে - পাশাপাশি একটি প্রত্যক্ষ পদ্ধতি:
with path.open() as f:
list(f)
আপনি যদি পুরো টেক্সটটিকে বিভক্ত করার আগে একক স্ট্রিং হিসাবে মেমোরিতে পড়তে আপত্তি করেন না তবে আপনি এটি Path
অবজেক্ট এবং splitlines()
স্ট্রিংয়ের পদ্ধতিতে ওয়ান-লাইনার হিসাবে করতে পারেন । ডিফল্টরূপে, splitlines
নতুনলাইনগুলি সরায়:
path.read_text().splitlines()
আপনি যদি নতুন লাইন রাখতে চান তবে পাস করুন keepends=True
:
path.read_text().splitlines(keepends=True)
আমি লাইন দ্বারা ফাইল লাইনটি পড়তে এবং প্রতিটি লাইনের তালিকার শেষে যুক্ত করতে চাই।
এখন এটি জিজ্ঞাসা করার জন্য কিছুটা নির্বোধ, আমরা বিভিন্ন পদ্ধতির সাহায্যে শেষ ফলাফলটি সহজেই প্রদর্শিত করেছি given আপনি নিজের তালিকা তৈরি করার সাথে সাথে আপনাকে ফিল্টার বা লাইন পরিচালনা করতে হতে পারে, সুতরাং আসুন এই অনুরোধটি হাস্যকর করুন।
ব্যবহারের list.append
ফলে আপনি প্রতিটি লাইন সংযোজন করার আগে ফিল্টার বা পরিচালনা করতে পারবেন:
line_list = []
for line in fileinput.input(filename):
line_list.append(line)
line_list
ব্যবহার list.extend
করা কিছুটা আরও সরাসরি হবে, এবং আপনার যদি পূর্বনির্মাণের তালিকা রয়েছে তবে সম্ভবত দরকারী:
line_list = []
line_list.extend(fileinput.input(filename))
line_list
বা আরও অজ্ঞাতসারে, এর পরিবর্তে আমরা একটি তালিকা বোঝার ব্যবহার করতে পারি, এবং যদি প্রয়োজন হয় তবে এর ভিতরে মানচিত্র এবং ফিল্টার করতে পারি:
[line for line in fileinput.input(filename)]
বা আরও সরাসরি, বৃত্তটি বন্ধ করতে, কেবল লাইনে কাজ না করে সরাসরি একটি নতুন তালিকা তৈরি করতে তালিকায় এটি পাস করুন:
list(fileinput.input(filename))
আপনি একটি ফাইল থেকে একটি তালিকাতে লাইন পেতে বিভিন্ন উপায়ে দেখেছেন, তবে আমি আপনাকে সুপারিশ করব যে আপনি একটি বৃহত পরিমাণে ডেটা একটি তালিকায় রূপায়ণ করবেন এবং পরিবর্তে যদি সম্ভব হয় তবে ডেটা প্রক্রিয়া করার জন্য পাইথনের অলস পুনরাবৃত্তিটি ব্যবহার করুন।
যে, পছন্দ fileinput.input
বা with path.open() as f
।
আপনি NumPy এ লোডটেক্সট কমান্ডটি ব্যবহার করতে পারেন। এটি জেনফ্র্যামটেক্সটের চেয়ে কম শর্তের জন্য পরীক্ষা করে, তাই এটি আরও দ্রুত হতে পারে।
import numpy
data = numpy.loadtxt(filename, delimiter="\n")
আমি নিম্নলিখিত ব্যবহার করতে চান। অবিলম্বে লাইনগুলি পড়া।
contents = []
for line in open(filepath, 'r').readlines():
contents.append(line.strip())
বা তালিকা বোঝার ব্যবহার:
contents = [line.strip() for line in open(filepath, 'r').readlines()]
readlines()
, যা এমনকি মেমরির শাস্তিও দেয়। আপনি কেবল এটি মুছতে পারেন, কারণ কোনও (পাঠ্য) ফাইলের পুনরাবৃত্তি প্রতিটি লাইনকে পরিবর্তে দেয়।
with
ফাইলটি খোলার জন্য আপনার বিবৃতি ব্যবহার করা উচিত (এবং অন্তর্নিহিতভাবে বন্ধ করা)।
আমি নীচে উল্লিখিত পদ্ধতিগুলির একটি চেষ্টা করব। আমি যে উদাহরণস্বরূপ ফাইলটি ব্যবহার করি তার নাম রয়েছে dummy.txt
। আপনি ফাইলটি এখানে খুঁজে পেতে পারেন । আমার ধারণা, ফাইলটি কোডের মতো একই ডিরেক্টরিতে fpath
রয়েছে (সঠিক ফাইলের নাম এবং ফোল্ডার পথ অন্তর্ভুক্ত করতে আপনি পরিবর্তন করতে পারেন ।)
নীচে উল্লিখিত দুটি উদাহরণে আপনি যে তালিকাটি চান তা প্রদত্ত lst
।
1.> প্রথম পদ্ধতি :
fpath = 'dummy.txt'
with open(fpath, "r") as f: lst = [line.rstrip('\n \t') for line in f]
print lst
>>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.']
2.> সালে দ্বিতীয় পদ্ধতি , ব্যবহার করতে পারেন csv.reader পাইথন স্ট্যান্ডার্ড লাইব্রেরী থেকে মডিউল :
import csv
fpath = 'dummy.txt'
with open(fpath) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=' ')
lst = [row[0] for row in csv_reader]
print lst
>>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.']
আপনি দুটি পদ্ধতি ব্যবহার করতে পারেন। lst
দুটি পদ্ধতির সৃষ্টির জন্য নেওয়া সময় প্রায় সমান।
delimiter=' '
যুক্তি?
এখানে পাইথন (3) সহায়ক লাইব্রেরি ক্লাস রয়েছে যা আমি ফাইল I / O সরল করতে ব্যবহার করি:
import os
# handle files using a callback method, prevents repetition
def _FileIO__file_handler(file_path, mode, callback = lambda f: None):
f = open(file_path, mode)
try:
return callback(f)
except Exception as e:
raise IOError("Failed to %s file" % ["write to", "read from"][mode.lower() in "r rb r+".split(" ")])
finally:
f.close()
class FileIO:
# return the contents of a file
def read(file_path, mode = "r"):
return __file_handler(file_path, mode, lambda rf: rf.read())
# get the lines of a file
def lines(file_path, mode = "r", filter_fn = lambda line: len(line) > 0):
return [line for line in FileIO.read(file_path, mode).strip().split("\n") if filter_fn(line)]
# create or update a file (NOTE: can also be used to replace a file's original content)
def write(file_path, new_content, mode = "w"):
return __file_handler(file_path, mode, lambda wf: wf.write(new_content))
# delete a file (if it exists)
def delete(file_path):
return os.remove() if os.path.isfile(file_path) else None
তারপরে আপনি এই FileIO.lines
ফাংশনটি ব্যবহার করবেন :
file_ext_lines = FileIO.lines("./path/to/file.ext"):
for i, line in enumerate(file_ext_lines):
print("Line {}: {}".format(i + 1, line))
মনে রাখবেন যে mode
( "r"
ডিফল্টরূপে) এবং filter_fn
(ডিফল্টরূপে খালি লাইনের জন্য চেকগুলি) পরামিতিগুলি alচ্ছিক।
আপনি এমনকি read
, write
এবং delete
পদ্ধতিগুলি সরিয়ে ফেলতে এবং কেবল ছেড়ে দিতে পারেন FileIO.lines
, বা এটিকে একটি পৃথক পদ্ধতিতে পরিণত করতে পারেন যা বলা হয় read_lines
।
lines = FileIO.lines(path)
চেয়ে কি সত্যই যথেষ্ট সহজ with open(path) as f: lines = f.readlines()
? আপনি প্রতি কলটিতে 17 টি অক্ষরের মতো সঞ্চয় করছেন। (এবং বেশিরভাগ সময়, পারফরম্যান্স এবং স্মৃতিশক্তির কারণে, আপনি কোনও ফাইলের লাইনটি কোনও তালিকাতে লাইনটি পড়ার পরিবর্তে সরাসরি লুপ করতে চান, তাই আপনি এটি প্রায়শই ব্যবহার করতে চাইবেন না!) আমি প্রায়শই সামান্য ইউটিলিটি ফাংশন তৈরির এক অনুরাগী, তবে এটি আমার কাছে মনে হয় এটি স্ট্যান্ডার্ড লাইব্রেরির সাথে ইতিমধ্যে সংক্ষিপ্ত এবং সহজ কিছু লেখার জন্য কেবল অযথা নতুন উপায় তৈরি করছে।
#!/bin/python3
import os
import sys
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
filename = dname + sys.argv[1]
arr = open(filename).read().split("\n")
print(arr)
python3 somefile.py input_file_name.txt
file.readlines()
একটি-for
লুপ ব্যবহার করবেন না , একটি ফাইল অবজেক্ট নিজেই যথেষ্ট:lines = [line.rstrip('\n') for line in file]