উত্তর:
যদি পড়ার ফাইলটি বড় হয় এবং আপনি পুরো ফাইলটি একবারে মেমোরিতে পড়তে চান না:
fp = open("file")
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
fp.close()
লক্ষ্য করুন i == n-1
জন্য n
তম লাইন।
পাইথন ২.6 বা তার পরে:
with open("file") as fp:
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
enumerate(x)
ব্যবহার করে x.next
, সুতরাং এটি মেমরির পুরো ফাইল প্রয়োজন হয় না।
big file
। লুপটি সূচীতে পৌঁছাতে কয়েক বছর সময় নেবে
দ্রুত উত্তর:
f=open('filename')
lines=f.readlines()
print lines[25]
print lines[29]
বা:
lines=[25, 29]
i=0
f=open('filename')
for line in f:
if i in lines:
print i
i+=1
অনেকগুলি লাইন নিষ্কাশনের জন্য আরও মার্জিত সমাধান রয়েছে: লিনেকাচ (সৌজন্যে "পাইথন: একটি বিশাল টেক্সট ফাইলে একটি নির্দিষ্ট লাইনে কীভাবে ঝাঁপান ?" , পূর্ববর্তী স্ট্যাকওভারফ্লো ডটকম প্রশ্ন)।
উপরে লিঙ্কন পাইথন ডকুমেন্টেশন উদ্ধৃত:
>>> import linecache
>>> linecache.getline('/etc/passwd', 4)
'sys:x:3:3:sys:/dev:/bin/sh\n'
4
আপনার পছন্দসই লাইন নম্বরটিতে পরিবর্তন করুন এবং আপনি চালু আছেন। নোট করুন যে গণনাটি শূন্য-ভিত্তিক হওয়ায় 4 পঞ্চম লাইন নিয়ে আসবে।
ফাইলটি যদি খুব বড় আকারের হয়ে থাকে এবং মেমোরিতে পড়ার সময় সমস্যা সৃষ্টি করে তবে @ অলকের পরামর্শ নেওয়া এবং গণনা () ব্যবহার করা ভাল ধারণা হতে পারে ।
শেষ করা:
fileobject.readlines()
অথবা for line in fileobject
ছোট ফাইল জন্য একটি দ্রুত সমাধান হিসেবে।linecache
আরও মার্জিত সমাধানের জন্য ব্যবহার করুন যা অনেকগুলি ফাইল পড়ার পক্ষে দ্রুত হবে, বারবার সম্ভব হবে।enumerate()
নিন এবং যে ফাইলগুলি খুব বড় হতে পারে তার জন্য ব্যবহার করুন এবং এটি মেমরির সাথে খাপ খায় না। নোট করুন যে এই পদ্ধতিটি ব্যবহার করা ধীর হতে পারে কারণ ফাইলটি ধারাবাহিকভাবে পড়া হয়।linecache
মডিউলটির উত্সের দিকে চেয়েছি এবং দেখে মনে হচ্ছে এটি পুরো ফাইলটি মেমোরিতে পড়ে। সুতরাং, যদি আকার অপ্টিমাইজেশনের চেয়ে এলোমেলো অ্যাক্সেস বেশি গুরুত্বপূর্ণ linecache
হয় তবে এটি সর্বোত্তম পদ্ধতি।
linecache
এখন কেবল অজগর উত্স ফাইলগুলির জন্য কাজ করতে দেখা যাচ্ছে
linecache.getlines('/etc/passwd')[0:4]
প্রথম, দ্বিতীয়, তৃতীয় এবং চতুর্থ লাইনে পড়তেও ব্যবহার করতে পারেন।
একটি দ্রুত এবং সংক্ষিপ্ত পদ্ধতির হতে পারে:
def picklines(thefile, whatlines):
return [x for i, x in enumerate(thefile) if i in whatlines]
এটি কোনও উন্মুক্ত ফাইল-জাতীয় অবজেক্ট thefile
(কলকারীর কাছে ছেড়ে দেওয়া উচিত যা এটি কোনও ডিস্ক ফাইল থেকে খোলা উচিত, অথবা উদাহরণস্বরূপ সকেট, বা অন্য ফাইল-জাতীয় স্ট্রিমের মাধ্যমে) এবং শূন্য-ভিত্তিক লাইন সূচকগুলির একটি সেট গ্রহণ করে এবং একটি whatlines
ফেরত দেয় নিম্ন মেমরির পদচিহ্ন এবং যুক্তিসঙ্গত গতি সহ তালিকা। যদি ফিরিয়ে দেওয়া লাইনের সংখ্যাটি বিশাল হয় তবে আপনি জেনারেটরটিকে পছন্দ করতে পারেন:
def yieldlines(thefile, whatlines):
return (x for i, x in enumerate(thefile) if i in whatlines)
এটি কেবলমাত্র লুপিংয়ের জন্যই ভাল - লক্ষ্য করুন যে return
বিবৃতিতে বর্গাকার বন্ধনীগুলির চেয়ে গোলাকার ব্যবহারের মাধ্যমে কেবলমাত্র পার্থক্যটি আসে যথাক্রমে একটি তালিকা বোধগম্য এবং জেনারেটর এক্সপ্রেশন তৈরি করে।
আরও নোট করুন যে "লাইন" এবং "ফাইল" উল্লেখ করা সত্ত্বেও এই ফাংশনগুলি অনেক বেশি, সাধারণ - তারা যে কোনও পুনরাবৃত্তির উপর কাজ করবে, এটি একটি উন্মুক্ত ফাইল বা অন্য কোনও, আইটেমের একটি তালিকা (বা জেনারেটর) ফিরিয়ে দেবে তাদের প্রগতিশীল আইটেম-সংখ্যাগুলির ভিত্তিতে। সুতরাং, আমি আরও যথাযথভাবে সাধারণ নামগুলি ব্যবহার করার পরামর্শ দেব ;-)।
whatlines
এটি একটি হওয়া উচিত set
, কারণ if i in whatlines
একটি (সাজানো) তালিকার পরিবর্তে একটি সেট দিয়ে দ্রুত কার্যকর করা হবে। আমি প্রথমে এটি লক্ষ্য করিনি এবং পরিবর্তে বাছাই করা তালিকার সাথে আমার নিজের কুরুচিপূর্ণ সমাধানটি তৈরি করেছি (যেখানে আমাকে প্রতিবার একটি তালিকা স্ক্যান করতে হবে না, যখন if i in whatlines
এটি করা হয়) তবে পারফরম্যান্সের পার্থক্য ছিল নগণ্য (আমার ডেটা সহ) এবং এটি সমাধান অনেক বেশি মার্জিত।
আরেকটি সমাধান দেওয়ার জন্য:
import linecache
linecache.getline('Sample.txt', Number_of_Line)
আমি আশা করি এটি দ্রুত এবং সহজ :)
আপনি যদি লাইন 7 চান
লাইন = খুলুন ("file.txt", "আর") read পঠনরেখা () []]
close()
ফাইলটি এভাবে খুললে আপনি কী করবেন ?
সম্পূর্ণতার জন্য, এখানে আরও একটি বিকল্প রয়েছে is
পাইথন ডক্স থেকে একটি সংজ্ঞা দিয়ে শুরু করা যাক :
স্লাইস একটি বস্তু যা সাধারণত ক্রমের একটি অংশ থাকে। সাবস্ক্রিপ্ট স্বরলিপি ব্যবহার করে একটি স্লাইস তৈরি করা হয়, [বেশ কয়েকটি যখন দেওয়া হয় তখন সংখ্যার মধ্যে কলোন সহ, যেমন ভেরিয়েবল_নেম [1: 3: 5]। বন্ধনী (সাবস্ক্রিপ্ট) স্বরলিপি অভ্যন্তরীণভাবে স্লাইস অবজেক্ট ব্যবহার করে (বা পুরানো সংস্করণগুলিতে, __getslice __ () এবং __setslice __ ())।
যদিও স্লাইস স্বরলিপিটি সাধারণভাবে প্রত্যক্ষকারীর জন্য সরাসরি প্রযোজ্য নয়, itertools
প্যাকেজে একটি প্রতিস্থাপন ফাংশন রয়েছে:
from itertools import islice
# print the 100th line
with open('the_file') as lines:
for line in islice(lines, 99, 100):
print line
# print each third line until 100
with open('the_file') as lines:
for line in islice(lines, 0, 100, 3):
print line
ফাংশনের অতিরিক্ত সুবিধা হ'ল এটি শেষ পর্যন্ত পুনরুক্তি পাঠ করে না। সুতরাং আপনি আরও জটিল জিনিসগুলি করতে পারেন:
with open('the_file') as lines:
# print the first 100 lines
for line in islice(lines, 100):
print line
# then skip the next 5
for line in islice(lines, 5):
pass
# print the rest
for line in lines:
print line
এবং মূল প্রশ্নের উত্তর দিতে:
# how to read lines #26 and #30
In [365]: list(islice(xrange(1,100), 25, 30, 4))
Out[365]: [26, 30]
ফাইল পড়া অবিশ্বাস্য দ্রুত। 100 এমবি ফাইল পড়তে 0.1 সেকেন্ডেরও কম সময় লাগে ( পাইথন সহ আমার নিবন্ধটি পড়া এবং লেখার ফাইলগুলি দেখুন )। সুতরাং আপনার এটি সম্পূর্ণরূপে পড়া উচিত এবং তারপরে একক লাইনগুলির সাথে কাজ করা উচিত।
এখানে সর্বাধিক উত্তরগুলি যা দেয় তা ভুল নয়, তবে খারাপ শৈলী। ফাইলগুলি খোলার কাজটি সর্বদা সাথে করা উচিত with
কারণ এটি নিশ্চিত করে যে ফাইলটি আবার বন্ধ রয়েছে।
সুতরাং আপনার এটি করা উচিত:
with open("path/to/file.txt") as f:
lines = f.readlines()
print(lines[26]) # or whatever you want to do with this line
print(lines[30]) # or whatever you want to do with this line
যদি আপনার কাছে বিশাল ফাইল এবং মেমরির গ্রহণের বিষয়টি উদ্বেগজনক হয় তবে আপনি এটি লাইন লাইন প্রক্রিয়াকরণ করতে পারেন:
with open("path/to/file.txt") as f:
for i, line in enumerate(f):
pass # process line i
এর মধ্যে কিছু সুন্দর, তবে এটি আরও অনেক সহজভাবে করা যেতে পারে:
start = 0 # some starting index
end = 5000 # some ending index
filename = 'test.txt' # some file we want to use
with open(filename) as fh:
data = fin.readlines()[start:end]
print(data)
এটি কেবল স্লাইসিংয়ের তালিকা ব্যবহার করবে, এটি পুরো ফাইলটি লোড করে, তবে বেশিরভাগ সিস্টেমে যথাযথভাবে মেমরির ব্যবহার কমিয়ে দেবে, এটি উপরে বর্ণিত বেশিরভাগ পদ্ধতির চেয়ে দ্রুত এবং আমার 10 জি + ডেটা ফাইলগুলিতে কাজ করে। শুভকামনা!
আপনি একটি সন্ধান () কল করতে পারেন যা আপনার পঠন মাথাটি ফাইলের মধ্যে একটি নির্দিষ্ট বাইটে অবস্থান করে। আপনি যে লাইনে পড়তে চান তার আগে ফাইলটিতে ঠিক কতগুলি বাইট (অক্ষর) লেখা আছে তা না জানলে এটি আপনাকে সাহায্য করবে না। সম্ভবত আপনার ফাইলটি কঠোরভাবে ফর্ম্যাট করা হয়েছে (প্রতিটি লাইনটি বাইটের X সংখ্যা?) বা, আপনি যদি সত্যই গতি বাড়াতে চান তবে আপনি নিজেই অক্ষরের সংখ্যা গণনা করতে পারেন (লাইন ব্রেকগুলির মতো অদৃশ্য অক্ষরগুলি অন্তর্ভুক্ত করার বিষয়টি মনে রাখবেন)।
অন্যথায়, ইতিমধ্যে এখানে প্রস্তাবিত অনেকগুলি সমাধানের মধ্যে একটি হিসাবে আপনার ইচ্ছুক রেখার আগে আপনাকে প্রতিটি লাইন পড়তে হবে।
যদি আপনার বৃহত পাঠ্য ফাইলটি file
কঠোরভাবে কাঠামোগত হয় (যার অর্থ প্রতিটি লাইনের সমান দৈর্ঘ্য থাকে l
), আপনি n
-th লাইনের জন্য ব্যবহার করতে পারেন
with open(file) as f:
f.seek(n*l)
line = f.readline()
last_pos = f.tell()
দাবি অস্বীকার এটি কেবল একই দৈর্ঘ্যের ফাইলগুলির জন্য কাজ করে!
এটি সম্পর্কে:
>>> with open('a', 'r') as fin: lines = fin.readlines()
>>> for i, line in enumerate(lines):
if i > 30: break
if i == 26: dox()
if i == 30: doy()
আপনি যদি আমদানি করতে আপত্তি করেন না তবে ফাইলিনপুট আপনার যা প্রয়োজন ঠিক তা করে (এটি আপনি বর্তমান লাইনের লাইন নম্বরটি পড়তে পারেন)
def getitems(iterable, items):
items = list(items) # get a list from any iterable and make our own copy
# since we modify it
if items:
items.sort()
for n, v in enumerate(iterable):
if n == items[0]:
yield v
items.pop(0)
if not items:
break
print list(getitems(open("/usr/share/dict/words"), [25, 29]))
# ['Abelson\n', 'Abernathy\n']
# note that index 25 is the 26th item
কারণ এটির আরও বেশি সাধারণ আমি এই পদ্ধতির পছন্দ, IE আপনি একটি ফাইল তে এটি ব্যবহার করতে পারেন ফলাফলে, f.readlines()
একটি উপর StringIO
বস্তু, যাই হোক না কেন:
def read_specific_lines(file, lines_to_read):
"""file is any iterable; lines_to_read is an iterable containing int values"""
lines = set(lines_to_read)
last = max(lines)
for n, line in enumerate(file):
if n + 1 in lines:
yield line
if n + 1 > last:
return
>>> with open(r'c:\temp\words.txt') as f:
[s for s in read_specific_lines(f, [1, 2, 3, 1000])]
['A\n', 'a\n', 'aa\n', 'accordant\n']
এখানে আমার সামান্য 2 সেন্ট, এটির জন্য মূল্য;)
def indexLines(filename, lines=[2,4,6,8,10,12,3,5,7,1]):
fp = open(filename, "r")
src = fp.readlines()
data = [(index, line) for index, line in enumerate(src) if index in lines]
fp.close()
return data
# Usage below
filename = "C:\\Your\\Path\\And\\Filename.txt"
for line in indexLines(filename): # using default list, specify your own list of lines otherwise
print "Line: %s\nData: %s\n" % (line[0], line[1])
ফাইল অবজেক্টের একটি .readlines () পদ্ধতি রয়েছে যা আপনাকে ফাইলের সামগ্রীর তালিকান, তালিকা আইটেমের জন্য এক লাইন দেয়। এর পরে, আপনি কেবল সাধারণ তালিকা স্লাইসিং কৌশলগুলি ব্যবহার করতে পারেন।
@ ওপ, আপনি গণনা ব্যবহার করতে পারেন
for n,line in enumerate(open("file")):
if n+1 in [26,30]: # or n in [25,29]
print line.rstrip()
file = '/path/to/file_to_be_read.txt'
with open(file) as f:
print f.readlines()[26]
print f.readlines()[30]
স্টেটমেন্ট সহ স্টেটমেন্টটি ব্যবহার করে এটি ফাইলটি খোলে, 26 এবং 30 টি লাইন প্রিন্ট করে, তারপর ফাইলটি বন্ধ করে দেয়। সরল!
readlines()
পুনরাবৃত্তির কাছে প্রথম কলটি শেষ হয়ে যাওয়ার পরে এবং দ্বিতীয় কলটি খালি তালিকা ফেরত দেবে অথবা একটি ত্রুটি ফেলবে (যা মনে করতে পারে না)
আপনি ইতিমধ্যে এই সিনট্যাক্সটি দিয়ে খুব সহজেই এটি করতে পারেন যা ইতিমধ্যে কেউ উল্লেখ করেছেন, তবে এটি করার সহজ উপায় এটি:
inputFile = open("lineNumbers.txt", "r")
lines = inputFile.readlines()
print (lines[0])
print (lines[2])
লাইন # 3 মুদ্রণ করতে,
line_number = 3
with open(filename,"r") as file:
current_line = 1
for line in file:
if current_line == line_number:
print(file.readline())
break
current_line += 1
মূল লেখক: ফ্র্যাঙ্ক হফম্যান
একটি পাঠ্য ফাইলে নির্দিষ্ট লাইন মুদ্রণ করতে। একটি "লাইনস 2 প্রিন্ট" তালিকা তৈরি করুন এবং তারপরে যখন রেখা 2 প্রিন্ট তালিকায় গণনাটি "ইন" থাকবে তখন কেবল মুদ্রণ করুন। অতিরিক্ত 'of n' থেকে মুক্তি পেতে লাইন.স্ট্রিপ () বা লাইন.স্ট্রিপ ('\ n') ব্যবহার করুন। আমি ঠিক "তালিকা বোঝার" পছন্দ করি এবং যখন পারি তখন ব্যবহার করার চেষ্টা করি। কোনও কারণেই কোনও ফাইল খোলা রাখা রোধ করতে আমি "উইথ" পদ্ধতিটি পাঠ্য ফাইলগুলি পড়তে পছন্দ করি।
lines2print = [26,30] # can be a big list and order doesn't matter.
with open("filepath", 'r') as fp:
[print(x.strip()) for ei,x in enumerate(fp) if ei in lines2print]
বা যদি তালিকাটি ছোট হয় তবে অনুধাবনের তালিকা হিসাবে তালিকায় টাইপ করুন।
with open("filepath", 'r') as fp:
[print(x.strip()) for ei,x in enumerate(fp) if ei in [26,30]]
পছন্দসই লাইন প্রিন্ট করতে। প্রয়োজনীয় লাইনের উপরে / নীচে লাইন প্রিন্ট করতে।
def dline(file,no,add_sub=0):
tf=open(file)
for sno,line in enumerate(tf):
if sno==no-1+add_sub:
print(line)
tf.close()
এক্সিকিউট করুন ----> dline ("D: um dummy.txt", 6) অর্থাত্ dline ("ফাইলের পাথ", লাইন_ সংখ্যা, আপনি যদি অনুসন্ধান করা লাইনের উপরের লাইনটি নিম্ন -1 এর জন্য 1 দিতে চান তবে এটি isচ্ছিক ডিফল্ট মান হবে নেওয়া হবে 0)
আপনি যদি নির্দিষ্ট রেখাগুলি পড়তে চান যেমন লাইন কিছু থ্রেশহোল্ড লাইনের পরে শুরু হয় তবে আপনি নিম্নলিখিত কোডগুলি ব্যবহার করতে পারেন,
file = open("files.txt","r")
lines = file.readlines() ## convert to list of lines
datas = lines[11:] ## raed the specific lines
f = open(filename, 'r')
totalLines = len(f.readlines())
f.close()
f = open(filename, 'r')
lineno = 1
while lineno < totalLines:
line = f.readline()
if lineno == 26:
doLine26Commmand(line)
elif lineno == 30:
doLine30Commmand(line)
lineno += 1
f.close()
আমি মনে করি এটি কাজ করবে
open_file1 = open("E:\\test.txt",'r')
read_it1 = open_file1.read()
myline1 = []
for line1 in read_it1.splitlines():
myline1.append(line1)
print myline1[0]