কিভাবে একটি তালিকা মধ্যে একটি লাইন বাই লাইন পড়তে?


2027

পাইথনের ফাইলের প্রতিটি লাইন কীভাবে পড়ব এবং প্রতিটি লাইনকে একটি তালিকার উপাদান হিসাবে সংরক্ষণ করব?

আমি লাইন দ্বারা ফাইল লাইনটি পড়তে এবং প্রতিটি লাইনের তালিকার শেষে যুক্ত করতে চাই।

উত্তর:


2173
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] 

206
file.readlines()একটি- forলুপ ব্যবহার করবেন না , একটি ফাইল অবজেক্ট নিজেই যথেষ্ট:lines = [line.rstrip('\n') for line in file]
jfs

88
আপনি যে ক্ষেত্রে বিগ ডেটা ব্যবহার করে readlines()কাজ করছেন তা খুব কার্যকর নয় কারণ এটি মেমোরিআরারের ফলে তৈরি হতে পারে । এক্ষেত্রে for line in f:প্রতিটি lineভেরিয়েবল ব্যবহার করে এবং কাজ করে ফাইলে পুনরাবৃত্তি করা ভাল ।
ডার্কসিগনাস

7
আমি এখানে উল্লিখিত পদ্ধতিটি ব্যবহার করে উত্তরে প্রদত্ত বিভিন্ন উপায়ে মেমরি প্রোফাইল পরীক্ষা করেছি checked । মেমোরি ব্যবহার অনেক ভালো যেমন @DevShark দ্বারা প্রস্তাবিত যখন প্রতিটি লাইন ফাইল থেকে পড়া এবং প্রক্রিয়াকৃত হয়, হয় এখানে । মেমরির সীমাবদ্ধতা বা ফাইল বড় হলে কোনও সংগ্রহ অবজেক্টে সমস্ত লাইন ধরে রাখা ভাল ধারণা নয় । উভয় পদ্ধতির মধ্যে মৃত্যুদন্ড কার্যকর করার সময় একই রকম।
তীর্থ আর

6
এছাড়াও, .rstrip()আপনি যদি লাইনের শেষ প্রান্ত থেকে হোয়াইটস্পেস সরিয়ে নিচ্ছেন তবে কিছুটা দ্রুত কাজ করবে।
গ্রিঙ্গো সুভে

1001

দেখুন ইনপুট এবং Ouput :

with open('filename') as f:
    lines = f.readlines()

অথবা নিউলাইন চরিত্রটি কেটে ফেলা সহ:

with open('filename') as f:
    lines = [line.rstrip() for line in f]

11
আরও ভাল, ব্যবহার করুন f.read().splitlines()যা নতুনলাইনগুলি সরিয়ে দেয়
মার্ক

দ্বিতীয় সংস্করণটি কি for line in open(filename)নিরাপদ? অর্থাৎ ফাইলটি কি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে?
বেকো

2
একবারে পুরো ফাইলটি মেমরিতে পড়ার চেয়ে একবারে ফাইলটি এক লাইনে পড়া ভাল read এটি করা বড় ইনপুট ফাইলগুলির সাথে ভাল স্কেল করে না। রবার্ট দ্বারা নীচে উত্তর দেখুন।
ব্র্যাড হেইন

1
lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]আমি যদি এভাবে লিখি, পড়ার পরে কীভাবে ফাইলটি বন্ধ করব?
রামিসা আনজুম অদিতি

2
হ্যাঁ, অন্যরা এখানে যে বক্তব্য তৈরি করছে, সেখানে openকনটেক্সট ম্যানেজার ছাড়া এটি ব্যবহার করা "সেরা অনুশীলন" নয় (বা এটি বন্ধ করার জন্য কোনও গ্যারান্টিযুক্ত উপায়), এটি সত্যিকার অর্থে এর মধ্যে একটি নয় - যখন বস্তুর আর কোনও উল্লেখ নেই when এটিতে আবর্জনা সংগ্রহ করা হবে এবং ফাইলটি বন্ধ হয়ে যাবে, যা তাত্ক্ষণিকভাবে ত্রুটির সাথে ঘটবে বা না হওয়া উচিত, যখন তালিকাটি বোঝার প্রক্রিয়া সম্পন্ন হবে।
অ্যারন হল

578

এটি প্রয়োজনের তুলনায় আরও স্পষ্ট, তবে আপনি যা চান তা করে।

with open("file.txt") as file_in:
    lines = []
    for line in file_in:
        lines.append(line)

18
আমি এই উত্তরটিকে পছন্দ করি যেহেতু এটি পুরো ফাইলটিকে মেমরিতে লোড করার প্রয়োজন হয় না (এই ক্ষেত্রে এটি এখনও arrayযদিও সংযোজন করা হয়েছে তবে অন্য পরিস্থিতিতেও থাকতে পারে)। অবশ্যই বড় ফাইলগুলির জন্য এই পদ্ধতির সমস্যা হ্রাস হতে পারে।
জোহানেসবি

1
একটি অ্যারেতে যুক্ত হওয়া ধীর। আমি কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না যেখানে এটি সেরা সমাধান।
ইলিয়াস স্ট্রেলে

@ হ্যাকগুলি কি এটি আরও ভাল কারণ এটি পুরো ফাইলটিকে মেমরিতে লোড করে না বা আরও কিছু আছে?
অরিগামিএই

4
দ্রষ্টব্য: এই সমাধানটি নতুন লাইনের স্ট্রিপ দেয় না।
এএমসি

1
এই সমাধানটি পুরো ফাইলটিকে মেমোরিতে লোড করে না। আমি জানি না কেন লোকেরা এটা মনে করে না।
andrebrait

274

এটি ফাইল থেকে লাইনগুলির একটি "অ্যারে" উপস্থাপন করবে।

lines = tuple(open(filename, 'r'))

openএকটি ফাইল ফেরত দেয় যা পুনরাবৃত্তি হতে পারে। আপনি যখন কোনও ফাইলের উপরে পুনরাবৃত্তি করেন, আপনি সেই ফাইলটি থেকে লাইনগুলি পান। tupleএকটি পুনরাবৃত্তি গ্রহণ করতে পারে এবং আপনি এটির যে পুনরাবৃত্তিটি দিয়ে থাকেন তা থেকে আপনার জন্য একটি দ্বৈত উদাহরণ ইনস্ট্যান্ট করতে পারে। linesফাইলের লাইন থেকে তৈরি একটি টুপল।


30
এর lines = open(filename).read().split('\n')পরিবর্তে মার্শালফারিয়ার চেষ্টা করুন
নোকটিস স্কাইটিওয়ার

16
এটি ফাইল বন্ধ করে দেয়?
ভানুয়ান

5
@ ভানুয়ান যেহেতু লাইনটি চালুর পরে ফাইলটির বাকী কোনও রেফারেন্স নেই, তাই ডেস্ট্রাক্টরকে ফাইলটি স্বয়ংক্রিয়ভাবে বন্ধ করা উচিত
নোকটিস স্কাইটিওয়ার

30
@ নোকটিসস্কিটওয়ারটি আমি lines = open(filename).read().splitlines()একটু ক্লিনার পেয়েছি এবং আমি বিশ্বাস করি এটি ডস লাইন শেষগুলি আরও ভালভাবে পরিচালনা করে।
jaynp

8
@ mklement0 1000 টি লাইনের একটি ফাইল ধরে নেওয়া, একটি এর 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 বার চালানো থেকে ফলাফল আসে । আমার সমাধানটি যখন গতিশীলতার প্রয়োজনীয়তা অপরিচিত তখন গতির চেয়ে বেশি স্থানের পক্ষে।
নোকটিস স্কাইটওয়ার

194

আপনি যদি \nঅন্তর্ভুক্ত চান :

with open(fname) as f:
    content = f.readlines()

আপনি যদি \nঅন্তর্ভুক্ত না চান :

with open(fname) as f:
    content = f.read().splitlines()

168

পাইথনের ফাইল অবজেক্টের পদ্ধতি অনুসারে কোনও পাঠ্য ফাইলকে একটিতে রূপান্তর করার সহজ উপায় 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

149

প্রস্তাবিত হিসাবে আপনি কেবল নিম্নলিখিতটি করতে পারেন:

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 পাসে। জেনেরিক পার্সাররা কীভাবে কাজ করবে এটি সাধারণত এটি।


5
এটি আমার প্রয়োজন ঠিক ছিল - এবং ডাউনসাইডগুলি ব্যাখ্যা করার জন্য ধন্যবাদ। পাইথনের শিক্ষানবিস হিসাবে, সমাধান কেন সমাধান তা বুঝতে পেরে এটি দুর্দান্ত। চিয়ার্স!
এফেক্সিক্স

5
আরও কিছুটা ভাবেন কোরি। আপনি কি কখনও এই লাইনের সাথে কোনও কাজ না করেই আপনার কম্পিউটারটি প্রতিটি লাইন পড়তে চান? অবশ্যই আপনি উপলব্ধি করতে পারেন যে আপনার সর্বদা এগুলি কোনও না কোনও উপায়ে প্রক্রিয়া করা প্রয়োজন।
দেবশর্ক

5
আপনার সবসময় লাইনগুলি দিয়ে কিছু করা দরকার। এটি লাইনগুলি মুদ্রণ করা বা গণনা করার মতো সহজ হতে পারে। আপনার প্রক্রিয়াটির স্মৃতিতে লাইনগুলি পড়ার কোনও মূল্য নেই, তবে এটি দিয়ে কিছু না করে।
দেবশর্ক

2
আপনার সবসময় তাদের সাথে কিছু করা দরকার। আমি মনে করি আপনি যে বিন্দুটি তৈরি করার চেষ্টা করছেন সেটি হ'ল আপনি একবারে না হয়ে একবারে সমস্তটির জন্য একটি ফাংশন প্রয়োগ করতে চাইতে পারেন। সত্যই মাঝে মধ্যে এটি হয়। তবে এটির জন্য স্মৃতি দৃষ্টিভঙ্গি থেকে এটি অত্যন্ত অদক্ষ এবং এটির রাম থেকে আপনার পায়ের ছাপ বড় হলে আপনাকে ফাইল পড়তে বাধা দেয়। এ কারণেই সাধারণত জেনেরিক পার্সারগুলি আমার বর্ণিত পদ্ধতিতে কাজ করে।
দেবশার্ক

2
পছন্দ করুন কেবলমাত্র পঠন মোডে ফাইলটি খোলা আছে তা প্রদত্ত, আপনি উপরের কোড সহ মূল ফাইলটি পরিবর্তন করতে পারবেন না। উভয়ই পড়া এবং লেখার জন্য একটি ফাইল খুলতে, ব্যবহার করুনopen('file_path', 'r+')
DevShark

62

তালিকায় তথ্য

অনুমান করুন যে আমাদের নিম্নোক্ত লাইনের মতো আমাদের ডেটা সহ একটি পাঠ্য ফাইল রয়েছে,

পাঠ্য ফাইল সামগ্রী:

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"প্রয়োজনীয়?
Mausy5043

@ মাউসি 43০৪৩ নং, তবে আপনি যখন কোনও পাঠ্য ফাইলটি পড়েন তখন আপনার কিছু অদ্ভুত চরিত্র থাকতে পারে (বিশেষত ইতালিয়ান ভাষায়)
জিওভান্নি জি পিওয়াই

1
read().splitlines()পাইথন আপনাকে সরবরাহ করে: এটি কেবল readlines()(যা সম্ভবত দ্রুত, এটি কম অপচয় হিসাবে)।
এরিক হে লেবিগোট

43

একটি তালিকায় একটি ফাইল পড়তে আপনাকে তিনটি জিনিস করতে হবে:

  • ফাইলটি খুলুন
  • ফাইল পড়ুন
  • তালিকা হিসাবে বিষয়বস্তু সংরক্ষণ করুন

ভাগ্যক্রমে পাইথন এই জিনিসগুলি করা খুব সহজ করে তোলে তাই কোনও তালিকার মধ্যে ফাইল পড়ার সবচেয়ে সংক্ষিপ্ততম উপায় হ'ল:

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:
  • সর্বদা উপলব্ধ ফাংশন / শ্রেণীর জন্য ডকুমেন্টেশন ব্রাউজ করুন। বেশিরভাগ সময় টাস্কের জন্য একটি নিখুঁত মিল বা কমপক্ষে একটি বা দুটি ভাল থাকে ones এক্ষেত্রে সুস্পষ্ট পছন্দটি হ'ল readlines()তবে আপনি যদি তালিকাটিতে স্টোর করার আগে লাইনগুলি প্রসেস করতে চান তবে আমি একটি সহজ তালিকা-বোধগম্যতার প্রস্তাব দিই।

পাইথনে একটি ফাইল খোলার জন্য সর্বশেষ পদ্ধতির প্রস্তাবিত পন্থা! তাহলে কেন এটা শেষ? লোকের সংখ্যাগরিষ্ঠ লোকেরা কি উত্তর নিয়ে যাওয়ার আগে কোনও উত্তরের প্রথম কয়েক লাইনে এক নজরে দেখবে না?
এএমসি

@ এএমসি আমি উত্তরটি লেখার সময় এটিতে খুব বেশি চিন্তা করি নি। আপনি কি মনে করেন যে এটি আমার উত্তরের শীর্ষে রাখা উচিত?
এমসিফার্ট

এটি সেরা হতে পারে, হ্যাঁ। আমি কেবল লক্ষ্য করেছি যে আপনি পাইথন 2 উল্লেখ করেছেন, যাতে এটিও আপডেট করা যায়।
এএমসি

আহ প্রশ্নটি মূলত অজগর -২.২ ট্যাগ হয়েছিল। এটি আরও সাধারণভাবে আপডেট করা বোধগম্য হতে পারে। আমি পরের বারে এসেছি কিনা তা দেখতে পাব। আপনার পরামর্শের জন্য ধন্যবাদ। অনেক প্রশংসিত!
ম্যাসিফের্ট

42

একটি তালিকাতে একটি ফাইলের লাইনগুলি পড়ার পরিষ্কার এবং পাইথোনিক উপায়


প্রথম এবং সর্বাগ্রে, আপনার ফাইলটি খোলার এবং এর বিষয়বস্তুগুলি দক্ষ এবং অজগর উপায়ে পড়াতে আপনার দৃষ্টি নিবদ্ধ করা উচিত। আমি ব্যক্তিগতভাবে যেভাবে পছন্দ করি না তার উদাহরণ এখানে:

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ã.

30

পাইথন ৩.৪-তে উপস্থাপিত হয়েছে, pathlibফাইলগুলি থেকে পাঠ্য পাঠ করার জন্য খুব সুবিধাজনক পদ্ধতি রয়েছে, যা নীচে:

from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()

( splitlinesকলটি সেটিকে ফাইলের সমস্ত বিষয়বস্তুযুক্ত স্ট্রিং থেকে ফাইলের রেখার তালিকায় পরিণত করে)।

pathlibএতে প্রচুর সুবিধাজনক সুযোগ রয়েছে। read_textসুন্দর এবং সংক্ষিপ্ত, এবং আপনাকে ফাইলটি খোলার এবং বন্ধ করার বিষয়ে চিন্তা করতে হবে না। আপনার ফাইলটি যা করার দরকার তা যদি সমস্ত একসাথে পড়তে হয় তবে এটি একটি ভাল পছন্দ।


29

ফাইলগুলিতে তালিকা বোঝার ব্যবহার করে এখানে আরও একটি বিকল্প রয়েছে;

lines = [line.rstrip() for line in open('file.txt')]

পাইথন ইন্টারপ্রেটারের বেশিরভাগ কাজ সম্পন্ন হওয়ায় এটি আরও কার্যকর উপায় হওয়া উচিত।


10
rstrip()সম্ভাব্যভাবে সমস্ত পেছনের শ্বেতক্ষেত্রগুলি সরিয়ে দেয়, কেবলমাত্র নয় \n; ব্যবহার .rstrip('\n')
mklement0

এটিও গ্যারান্টি দেয় না যে সমস্ত পাইথন বাস্তবায়ন পড়ার পরে ফাইলটি বন্ধ হয়ে যাবে (যদিও সিপিথনে, মূল পাইথন বাস্তবায়ন এটি হবে)।
মার্ক

1
পাইথন ইন্টারপ্রেটারের বেশিরভাগ কাজ সম্পন্ন হওয়ায় এটি আরও কার্যকর উপায় হওয়া উচিত। ওটার মানে কি?
এএমসি

28
f = open("your_file.txt",'r')
out = f.readlines() # will append in the list out

এখন ভেরিয়েবল আপনি যা চান তার একটি তালিকা (অ্যারে)। আপনি হয় করতে পারেন:

for line in out:
    print (line)

বা:

for line in f:
    print (line)

আপনি একই ফলাফল পাবেন।


27

পাইথন 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

আরও উন্নত ফাইল রাইটিং / পড়া

আপনার প্রয়োগের জন্য, নিম্নলিখিতগুলি গুরুত্বপূর্ণ হতে পারে:

  • অন্যান্য প্রোগ্রামিং ভাষা দ্বারা সমর্থন
  • পড়া / লেখার পারফরম্যান্স
  • সংক্ষিপ্ততা (ফাইলের আকার)

আরও দেখুন: ডেটা সিরিয়ালাইজেশন ফর্ম্যাটগুলির তুলনা

আপনি যদি কনফিগারেশন ফাইলগুলি তৈরির পরিবর্তে কোনও উপায় খুঁজছেন তবে আপনি পাইথনে আমার সংক্ষিপ্ত নিবন্ধ কনফিগারেশন ফাইলগুলি পড়তে চাইতে পারেন ।


26

অন্য একটি বিকল্প numpy.genfromtxtউদাহরণস্বরূপ:

import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")

এটি dataআপনার ফাইলে যতগুলি সারি রয়েছে তার সাথে একটি নুমপি অ্যারে তৈরি করবে ।


25

আপনি যদি কমান্ড লাইন থেকে বা স্টিডিনের কোনও ফাইল পড়তে চান তবে আপনি মডিউলটিও ব্যবহার করতে পারেন 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


20

এটি করার সহজ উপায়

একটি সহজ উপায়:

  1. স্ট্রিং হিসাবে পুরো ফাইলটি পড়ুন
  2. রেখা দ্বারা স্ট্রিং লাইন বিভক্ত করুন

এক লাইনে, এটি দেবে:

lines = open('C:/path/file.txt').read().splitlines()

যাইহোক, এটি বেশ অযোগ্য উপায় কারণ এটি মেমরিতে 2 টি সামগ্রীর সংস্করণ সংরক্ষণ করবে (ছোট ফাইলগুলির জন্য সম্ভবত এটি কোনও বড় সমস্যা নয় তবে এখনও)। [ধন্যবাদ মার্ক আমেরি]।

আরও দুটি সহজ উপায় রয়েছে:

  1. পুনরুক্তিকারী হিসাবে ফাইলটি ব্যবহার করা হচ্ছে
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')]
  1. যদি আপনি পাইথন ৩.৪ বা তার বেশি ব্যবহার 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()) মেমোরিতে একবারে সংরক্ষণ করছেন।
মার্ক অ্যামেরি

পছন্দ করুন এটি হাইলাইট করার জন্য ধন্যবাদ। আমি আমার উত্তর আপডেট করেছি।
জিন-ফ্রাঙ্কোয়েস টি।

14

কেবল স্প্লিটলাইনগুলি () ফাংশন ব্যবহার করুন। এখানে একটি উদাহরণ।

inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3

আউটপুটে আপনার লাইনের তালিকা থাকবে।


ব্যবহারের তুলনায় মেমরি-অদক্ষ .readlines()। এটি ফাইল কন্টেন্টের দুটি অনুলিপি একবারে মেমোরিতে রাখে (একক বিশাল স্ট্রিং হিসাবে একটি, লাইনের তালিকার জন্য একটি)।
মার্ক

11

আপনি যদি খুব বড় / বিশাল ফাইলের মুখোমুখি হতে চান এবং দ্রুত পড়তে চান (কল্পনা করুন যে আপনি টপকোডার / হ্যাকারংকঙ্ক কোডিং প্রতিযোগিতায় রয়েছেন), আপনি হয়ত একবারে স্মৃতি বাফারে লাইনগুলির একটি বড় অংশ পড়তে পারেন, তার চেয়ে বরং ফাইল স্তরে লাইন দ্বারা কেবল পুনরাবৃত্তি করুন।

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)

প্রক্রিয়া (লাইন) কি করে? আমি একটি ত্রুটি পেয়েছি যে এখানে কোনও ভেরিয়েবল সংজ্ঞায়িত হয়নি। আমি অনুমান করি যে কোনও কিছুর আমদানি করা দরকার এবং আমি মাল্টিপ্রসেসিং.প্রসেসটি আমদানির চেষ্টা করেছি তবে এটি আমার অনুমান নয়। আপনি দয়া করে বিস্তারিত বলতে পারেন? ধন্যবাদ
নিউজকুলার

1
process(line)ডেটা প্রক্রিয়া করার জন্য আপনার এমন একটি ফাংশন যা প্রয়োগ করতে হবে। উদাহরণস্বরূপ, সেই রেখার পরিবর্তে, আপনি যদি ব্যবহার করেন তবে print(line)এটি প্রতিটি লাইনটি লাইন_বাফার থেকে মুদ্রণ করবে।
খানাল

f.readlines (বাফারসাইজ) একটি অপরিবর্তনীয় বাফার প্রদান করে। আপনি যদি আপনার বাফারে সরাসরি পড়তে চান তবে আপনার রিডিন্টো () ফাংশনটি ব্যবহার করতে হবে। আমি অনেক দ্রুত হবে।
ডেভিড দেহগান

7

কিছু অতিরিক্ত সুবিধা সহ এটি করার সহজ উপায়গুলি হল:

lines = list(open('filename'))

অথবা

lines = tuple(open('filename'))

অথবা

lines = set(open('filename'))

ক্ষেত্রে ক্ষেত্রে set, আমাদের অবশ্যই মনে রাখতে হবে যে আমাদের কাছে লাইন অর্ডার সংরক্ষণ করা নেই এবং নকল করা লাইনগুলি থেকে মুক্তি পেতে পারি।

নীচে আমি @ মারকআমেরি থেকে একটি গুরুত্বপূর্ণ পরিপূরক যুক্ত করেছি :

যেহেতু আপনি .closeফাইল অবজেক্টে কল করছেন না বা একটি withবিবৃতি ব্যবহার করছেন না তাই কিছু পাইথন বাস্তবায়নে ফাইল পড়ার পরে ফাইলটি বন্ধ না হতে পারে এবং আপনার প্রক্রিয়াটি একটি উন্মুক্ত ফাইল হ্যান্ডেল ফাঁস করবে

ইন CPython (স্বাভাবিক পাইথন বাস্তবায়ন যে অধিকাংশ লোক ব্যবহার করুন), এই একটা সমস্যা থেকে ফাইল বস্তুর অবিলম্বে আবর্জনা-সংগৃহীত পাবেন এবং এই ফাইলটি বন্ধ হয়ে যাবে না, কিন্তু এটা তবু সাধারণভাবে ভালো কিছু করতে সেরা অনুশীলনের বিবেচিত হচ্ছে :

with open('filename') as f: lines = list(f) 

আপনি যে পাইথন প্রয়োগ করছেন তা নির্বিশেষে ফাইলটি বন্ধ হয়ে যায় তা নিশ্চিত করতে ।


1
যেহেতু আপনি .closeফাইল অবজেক্টে কল করছেন না বা একটি withবিবৃতি ব্যবহার করছেন না তাই কিছু পাইথন বাস্তবায়নে ফাইল পড়ার পরে ফাইলটি বন্ধ না হতে পারে এবং আপনার প্রক্রিয়াটি একটি উন্মুক্ত ফাইল হ্যান্ডেল ফাঁস করবে। সিপিথনে (সাধারণ পাইথন বাস্তবায়ন যা বেশিরভাগ লোকেরা ব্যবহার করেন), এটি কোনও সমস্যা নয় যেহেতু ফাইল অবজেক্টটি তাত্ক্ষণিকভাবে আবর্জনা সংগ্রহ করবে এবং এটি ফাইলটি বন্ধ হয়ে যাবে, তবে এটি সাধারণত এটি with open('filename') as f: lines = list(f)নিশ্চিত করার মতো কিছু করার সর্বোত্তম অনুশীলন হিসাবে বিবেচিত হয় পাইথন প্রয়োগ আপনি ব্যবহার করছেন তা বিবেচনা না করেই ফাইলটি বন্ধ হয়ে যায়।
মার্ক

আপনার দুর্দান্ত মন্তব্যের জন্য ধন্যবাদ_মার্কএমেরি! আমি সত্যিই এটার প্রশংসা করছি.
সিংহুমিলিকো

1
@ সিমহুমিলিকো কেন সর্বশেষ (সঠিক) সমাধানটি শেষ পর্যন্ত রেখেছেন?
এএমসি

@ এএমসি, কারণ প্রথম, আমি সহজ উপায়গুলি এবং যুক্তির ধারাবাহিকতার জন্য প্রদর্শন করতে চেয়েছিলাম।
সিংহমাইলিকো

তদতিরিক্ত, আমি আশা করি আমার উত্তরটি তৈরি করা হয়েছে যাতে এটি সংক্ষিপ্ত এবং সহজেই পড়তে পারে।
সিংহমাইলিকো

4

এটা ব্যবহার কর:

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()সিএসভি ডেটা পড়ার জন্য , এখানে এটি কীভাবে উপযুক্ত?
এএমসি

4

রূপরেখা এবং সংক্ষিপ্তসার

একটি দিয়ে 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


4

নথিতে খালি রেখাগুলি আছে এমন ক্ষেত্রে আমি কন্টেন্টে পড়তে পছন্দ করি এবং filterখালি স্ট্রিং উপাদানগুলি রোধ করতে এটি পেরিয়ে যেতে চাই

with open(myFile, "r") as f:
    excludeFileContent = list(filter(None, f.read().splitlines()))

1
এটি অযৌক্তিক, সাবধান!
এএমসি

3

আপনি NumPy এ লোডটেক্সট কমান্ডটি ব্যবহার করতে পারেন। এটি জেনফ্র্যামটেক্সটের চেয়ে কম শর্তের জন্য পরীক্ষা করে, তাই এটি আরও দ্রুত হতে পারে।

import numpy
data = numpy.loadtxt(filename, delimiter="\n")

2

আমি নিম্নলিখিত ব্যবহার করতে চান। অবিলম্বে লাইনগুলি পড়া।

contents = []
for line in open(filepath, 'r').readlines():
    contents.append(line.strip())

বা তালিকা বোঝার ব্যবহার:

contents = [line.strip() for line in open(filepath, 'r').readlines()]

2
এর জন্য কোনও প্রয়োজন নেই readlines(), যা এমনকি মেমরির শাস্তিও দেয়। আপনি কেবল এটি মুছতে পারেন, কারণ কোনও (পাঠ্য) ফাইলের পুনরাবৃত্তি প্রতিটি লাইনকে পরিবর্তে দেয়।
এরিক হে লেবিগোট

2
withফাইলটি খোলার জন্য আপনার বিবৃতি ব্যবহার করা উচিত (এবং অন্তর্নিহিতভাবে বন্ধ করা)।
অরণ-ফে

2

আমি নীচে উল্লিখিত পদ্ধতিগুলির একটি চেষ্টা করব। আমি যে উদাহরণস্বরূপ ফাইলটি ব্যবহার করি তার নাম রয়েছে 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দুটি পদ্ধতির সৃষ্টির জন্য নেওয়া সময় প্রায় সমান।


1
দ্বিতীয় পদ্ধতির সুবিধা কী? কেন একটি অতিরিক্ত গ্রন্থাগার, যা প্রান্তের কেসগুলিতে যুক্ত করা হয় (ডিলিমিটার এবং কোট)?
চার্লি হার্ডিং

কিসের পক্ষে delimiter=' 'যুক্তি?
এএমসি

2

এখানে পাইথন (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 টি অক্ষরের মতো সঞ্চয় করছেন। (এবং বেশিরভাগ সময়, পারফরম্যান্স এবং স্মৃতিশক্তির কারণে, আপনি কোনও ফাইলের লাইনটি কোনও তালিকাতে লাইনটি পড়ার পরিবর্তে সরাসরি লুপ করতে চান, তাই আপনি এটি প্রায়শই ব্যবহার করতে চাইবেন না!) আমি প্রায়শই সামান্য ইউটিলিটি ফাংশন তৈরির এক অনুরাগী, তবে এটি আমার কাছে মনে হয় এটি স্ট্যান্ডার্ড লাইব্রেরির সাথে ইতিমধ্যে সংক্ষিপ্ত এবং সহজ কিছু লেখার জন্য কেবল অযথা নতুন উপায় তৈরি করছে।
মার্ক

@ মার্ক অ্যামেরি যা বলেছিলেন তা ছাড়াও কেন এর জন্য ক্লাস ব্যবহার করবেন?
এএমসি

1

কমান্ড লাইন সংস্করণ

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