python - রকম - বাংলায় পাইথন pdf
পাইথন টেক্সট ফাইল সংকলন (8)
@ ইন্সপেক্টর জি 4 ডিজে উত্তরের বিকল্প (২9-03-2016 তারিখের সেরা উত্তর)। আমি 436 এমবি 3 ফাইল দিয়ে পরীক্ষা করেছি।
@ ইন্সপেক্টর জি 4 ডিজেট সমাধান: 16২ সেকেন্ড
নিম্নলিখিত সমাধান: 125 সেকেন্ড
from subprocess import Popen
filenames = ['file1.txt', 'file2.txt', 'file3.txt']
fbatch = open('batch.bat','w')
str ="type "
for f in filenames:
str+= f + " "
fbatch.write(str + " > file4results.txt")
fbatch.close()
p = Popen("batch.bat", cwd=r"Drive:\Path\to\folder")
stdout, stderr = p.communicate()
ধারণাটি "পুরানো ভাল প্রযুক্তি" সুবিধা গ্রহণ করে একটি ব্যাচ ফাইল তৈরি করা এবং এটি কার্যকর করা। তার আধা পাইথন কিন্তু দ্রুত কাজ করে। উইন্ডোজ জন্য কাজ করে।
আমার কাছে ২0 টি ফাইলের নামের তালিকা রয়েছে, যেমন ['file1.txt', 'file2.txt', ...]
। আমি এই ফাইলগুলিকে একটি নতুন ফাইলে সংযোজন করতে পাইথন স্ক্রিপ্ট লিখতে চাই। আমি প্রতিটি ফাইল f = open(...)
দ্বারা খুলতে পারি, f.readline()
কল করে লাইনটি পড়তে এবং সেই নতুন ফাইলটিতে প্রতিটি লাইন লিখতে পারি। এটা আমার কাছে খুব "মার্জিত" বলে মনে হচ্ছে না, বিশেষ করে সেই অংশ যেখানে আমি // লাইন দ্বারা লিখতে চাই।
Python এ এটি করার আরও একটি "মার্জিত" উপায় আছে?
আমি কমনীয়তা সম্পর্কে জানি না, কিন্তু এটি কাজ করে:
import glob
import os
for f in glob.glob("file*.txt"):
os.system("cat "+f+" >> OutFile.txt")
এই এটা করা উচিত
বড় ফাইলের জন্য:
filenames = ['file1.txt', 'file2.txt', ...]
with open('path/to/output/file', 'w') as outfile:
for fname in filenames:
with open(fname) as infile:
for line in infile:
outfile.write(line)
ছোট ফাইলের জন্য:
filenames = ['file1.txt', 'file2.txt', ...]
with open('path/to/output/file', 'w') as outfile:
for fname in filenames:
with open(fname) as infile:
outfile.write(infile.read())
... এবং আরেকটি মজার বিষয় যা আমি ভাবি :
filenames = ['file1.txt', 'file2.txt', ...]
with open('path/to/output/file', 'w') as outfile:
for line in itertools.chain.from_iterable(itertools.imap(open, filnames)):
outfile.write(line)
দুঃখজনকভাবে, এই শেষ পদ্ধতিটি কয়েকটি খোলা ফাইল বর্ণনাকারীকে ছেড়ে দেয়, যা জিসি যেভাবে যত্ন নিতে পারে। আমি শুধু এটা আকর্ষণীয় ছিল
এটা ঠিক কি fileinput জন্য:
import fileinput
with open(outfilename, 'w') as fout, fileinput.input(filenames) as fin:
for line in fin:
fout.write(line)
এই ব্যবহারের ক্ষেত্রে, এটি নিজে ফাইলগুলির উপর পুনরাবৃত্তি করার চেয়ে সত্যিই বেশি সরল নয়, তবে অন্য ক্ষেত্রে, এটি একটি একক ইটারারেটর রয়েছে যা সমস্ত ফাইলের উপর পুনরাবৃত্তি করে যেমন একটি ফাইল ছিল তা খুব সহজ। (এছাড়াও, fileinput
যত তাড়াতাড়ি সম্ভব প্রতিটি ফাইল বন্ধ করে দেয়, মানে প্রতিটিকে with
close
with
বা close
করার প্রয়োজন নেই তবে এটি কেবল একটি লাইনের সঞ্চয়, এটি কোনও চুক্তি নয়।)
fileinput
কিছু অন্যান্য নিফটি বৈশিষ্ট্য রয়েছে, যেমন প্রতিটি লাইন ফিল্টার করে ফাইলগুলির মধ্যে স্থান পরিবর্তন করার ক্ষমতা।
মতামত হিসাবে উল্লেখ করা হয়েছে, এবং অন্য post আলোচনা করা হয়েছে, পাইথন 2.7 এর জন্য fileinput
নির্দেশিত হিসাবে কাজ করবে না। কোড পাইথন 2.7 অনুবর্তী করতে সামান্য পরিবর্তন এখানে
with open('outfilename', 'w') as fout:
fin = fileinput.input(filenames)
for line in fin:
fout.write(line)
fin.close()
ফাইল বস্তুর .read () পদ্ধতি পরীক্ষা করে দেখুন:
http://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects
আপনি ভালো কিছু করতে পারে:
concat = ""
for file in files:
concat += open(file).read()
বা আরো একটি 'মার্জিত' পাইথন উপায়:
concat = ''.join([open(f).read() for f in files])
যা এই নিবন্ধ অনুসারে: http://www.skymind.com/~ocrow/python_string/ দ্রুততম হবে।
ফাইলগুলি দৈত্য না হলে:
with open('newfile.txt','wb') as newf:
for filename in list_of_files:
with open(filename,'rb') as hf:
newf.write(hf.read())
# newf.write('\n\n\n') if you want to introduce
# some blank lines between the contents of the copied files
যদি ফাইলগুলি সম্পূর্ণরূপে RAM এ সম্পূর্ণরূপে পড়তে এবং অনুষ্ঠিত হওয়ার জন্য খুব বড় হয় তবে উদাহরণস্বরূপ read(10000)
ব্যবহার করে স্থির দৈর্ঘ্যের অংশগুলি দ্বারা লুপে প্রতিলিপি করা প্রতিটি ফাইলটি পড়ার জন্য আলগোরিদিমটি আলাদা আলাদা হতে হবে।
shutil.copyfileobj
ব্যবহার করুন।
এটি আপনার জন্য স্বয়ংক্রিয়ভাবে ইনপুট ফাইলগুলিকে ছিনে পাঠ করে, যা আরও কার্যকর এবং ইনপুট ফাইলগুলি পড়তে এবং এতে কাজ করবে যদি কিছু ইনপুট ফাইল মেমরিতে মাপসই করা খুব বড় হয়।
with open('output_file.txt','wb') as wfd:
for f in ['seg1.txt','seg2.txt','seg3.txt']:
with open(f,'rb') as fd:
shutil.copyfileobj(fd, wfd)
def concatFiles():
path = 'input/'
files = os.listdir(path)
for idx, infile in enumerate(files):
print ("File #" + str(idx) + " " + infile)
concat = ''.join([open(path + f).read() for f in files])
with open("output_concatFile.txt", "w") as fo:
fo.write(path + concat)
if __name__ == "__main__":
concatFiles()