ওপেন উইথ স্টেটমেন্ট ব্যবহার করে কীভাবে একটি ফাইল খুলবেন


198

আমি পাইথনে ফাইল ইনপুট এবং আউটপুট কীভাবে করব তা দেখছি। ফাইলের নামের বিপরীতে একটি নাম যাচাই করার সময় এবং ফাইলের উপস্থিতিতে টেক্সট সংযোজন করার সময় আমি একটি ফাইল থেকে অন্য ফাইলটিতে নামের তালিকা (প্রতিটি লাইন প্রতি এক) পড়তে নীচের কোডটি লিখেছি। কোড কাজ করে। এটি আরও ভাল করা যেতে পারে?

আমি with open(...ইনপুট এবং আউটপুট উভয় ফাইলের জন্য বিবৃতিটি ব্যবহার করতে চাইছিলাম তবে তারা দেখতে পাচ্ছে না যে কীভাবে একই ব্লকে থাকতে পারে মানে নামগুলি একটি অস্থায়ী স্থানে সংরক্ষণ করতে হবে to

def filter(txt, oldfile, newfile):
    '''\
    Read a list of names from a file line by line into an output file.
    If a line begins with a particular name, insert a string of text
    after the name before appending the line to the output file.
    '''

    outfile = open(newfile, 'w')
    with open(oldfile, 'r', encoding='utf-8') as infile:
        for line in infile:
            if line.startswith(txt):
                line = line[0:len(txt)] + ' - Truly a great person!\n'
            outfile.write(line)

    outfile.close()
    return # Do I gain anything by including this?

# input the name you want to check against
text = input('Please enter the name of a great person: ')    
letsgo = filter(text,'Spanish', 'Spanish2')

"মানে আমার নামগুলি একটি অস্থায়ী জায়গায় সংরক্ষণ করা দরকার"? এর দ্বারা আপনি কী বোঝাতে চেয়েছেন?
এস .লট

4
লক্ষ্য করুন filter()হয় একটি বিল্ট-ইন ফাংশন এবং যাতে আপনি সম্ভবত আপনার ফাংশন জন্য একটি আলাদা নাম নির্বাচন করা উচিত।
টম

2
@ টম নাম স্পেসে কি কোনও বিল্ট-ইন ফাংশনকে ওভাররাইড করে?
আপটাইড

2
@UpTide: হ্যাঁ, পাইথন LEGB অনুক্রমে পরিচালনা - স্থানীয়, আবদ্ধকারী, গ্লোবাল, বিল্ট-ইন (দেখুন stackoverflow.com/questions/291978/... )। সুতরাং, যদি আপনি একটি বিশ্বব্যাপী ফাংশন করেন ( filter()), এটি বিল্ট-ইন করার আগে পাওয়া যাবেfilter()
টম

উত্তর:


306

পাইথন open()একক একাধিক বক্তব্য রাখার অনুমতি দেয় with। আপনি এগুলি কমা-পৃথক করুন। আপনার কোডটি তখন হবে:

def filter(txt, oldfile, newfile):
    '''\
    Read a list of names from a file line by line into an output file.
    If a line begins with a particular name, insert a string of text
    after the name before appending the line to the output file.
    '''

    with open(newfile, 'w') as outfile, open(oldfile, 'r', encoding='utf-8') as infile:
        for line in infile:
            if line.startswith(txt):
                line = line[0:len(txt)] + ' - Truly a great person!\n'
            outfile.write(line)

# input the name you want to check against
text = input('Please enter the name of a great person: ')    
letsgo = filter(text,'Spanish', 'Spanish2')

এবং না, আপনি returnআপনার ফাংশনটির শেষে একটি স্পষ্ট করে রেখে কোনও লাভ করবেন না । আপনি returnতাড়াতাড়ি প্রস্থান করতে ব্যবহার করতে পারেন , তবে আপনার এটি শেষে ছিল এবং ফাংশনটি এটি ছাড়াই প্রস্থান করবে। (অবশ্যই কোনও ফাংশন যা কোনও মান দেয়, আপনি returnফিরে আসার জন্য মানটি নির্দিষ্ট করতে ব্যবহার করেন use )

একাধিক ব্যবহার open()আইটেম withপাইথন 2.5 সমর্থিত নয় যখন withবিবৃতি চালু করা হয়, অথবা পাইথন 2.6 মধ্যে, কিন্তু এটা পাইথন 2.7 এবং পাইথন 3.1 অথবা ঊর্ধ্বতন সংস্করণ সমর্থিত।

http://docs.python.org/references/compound_stmts.html#the-with-statement http://docs.python.org/release/3.1/references/compound_stmts.html#the-with-statement

যদি আপনি কোডটি লিখছেন যা অবশ্যই পাইথন 2.5, 2.6 বা 3.0 এ চালানো উচিত, withঅন্য উত্তরগুলি প্রস্তাবিত বা ব্যবহার হিসাবে স্টেটমেন্টগুলিকে নীড় করে contextlib.nested


28

এর মতো নেস্টেড ব্লক ব্যবহার করুন,

with open(newfile, 'w') as outfile:
    with open(oldfile, 'r', encoding='utf-8') as infile:
        # your logic goes right here

12

আপনি ব্লক দিয়ে আপনার বাসাতে পারেন। এটার মত:

with open(newfile, 'w') as outfile:
    with open(oldfile, 'r', encoding='utf-8') as infile:
        for line in infile:
            if line.startswith(txt):
                line = line[0:len(txt)] + ' - Truly a great person!\n'
            outfile.write(line)

এটি আপনার সংস্করণের চেয়ে ভাল কারণ আপনি গ্যারান্টি দিচ্ছেন যে outfileআপনার কোডটি ব্যতিক্রমের মুখোমুখি হয়ে থাকলেও এটি বন্ধ হয়ে যাবে। স্পষ্টতই আপনি চেষ্টা করে / শেষ পর্যন্ত এটি করতে পারতেন তবে withএটি করার সঠিক উপায়।

অথবা, যেমনটি আমি সবে শিখেছি, আপনার কাছে @ স্টেভেহের বর্ণিত বিবৃতিতে একাধিক প্রসঙ্গ পরিচালক থাকতে পারেন । এটি আমার কাছে বাসা বাঁধার চেয়ে ভাল বিকল্প বলে মনে হচ্ছে।

এবং আপনার চূড়ান্ত ছোটখাটো প্রশ্নের জন্য, রিটার্নটি কোনও আসল উদ্দেশ্য করে না। আমি এটি অপসারণ করা হবে।


অনেক ধন্যবাদ. আমি এটি চেষ্টা করব এবং আপনার উত্তরটি যদি / যখন আমি এটি কাজ করে তা গ্রহণ করব।
ডিসনামি

আবার ধন্যবাদ. আমি গ্রহণ করার আগে সাত মিনিটের জন্য অপেক্ষা করতে হবে।
ডিসনামি

7
@ ডিসনামি নিশ্চিত করুন যে আপনি সঠিক উত্তরটি গ্রহণ করেছেন (এবং এটি এটি নয়!) ;-)
ডেভিড হেফারনান

1

কখনও কখনও, আপনি একটি পরিবর্তনশীল পরিমাণ ফাইল খুলতে এবং প্রতিটিকে একই আচরণ করতে চাইতে পারেন, আপনি এটি দিয়ে এটি করতে পারেন contextlib

from contextlib import ExitStack
filenames = [file1.txt, file2.txt, file3.txt]

with open('outfile.txt', 'a') as outfile:
    with ExitStack() as stack:
        file_pointers = [stack.enter_context(open(file, 'r')) for file in filenames]                
            for fp in file_pointers:
                outfile.write(fp.read())                   
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.