কোডের 1 লাইনে একটি ফাইল পড়ুন এবং বন্ধ করুন


128

এখন আমি ব্যবহার:

pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()

তবে কোডটি আরও ভাল দেখানোর জন্য, আমি এটি করতে পারি:

output = open('pagehead.section.htm','r').read()

উপরের সিনট্যাক্সটি ব্যবহার করার সময়, সিস্টেম সংস্থানগুলি মুক্ত করার জন্য আমি কীভাবে ফাইলটি বন্ধ করব?


19
ওয়ান-লাইনার সম্পর্কে সহজাতভাবে আরও আকর্ষণীয় কিছুই নেই। কোডটি লেখার চেয়ে অনেক বেশিবার পড়া হয় এবং বোঝার জন্য এটি লেখা উচিত, "শীতলতার জন্য নয়"। একমাত্র ব্যতিক্রম হ'ল যখন কোনও ভাষায় সুপরিচিত আইডিয়ম থাকে তবে আমি এই ক্ষেত্রে একটির বিষয়ে অজানা।
drdwilcox

17
@ ডিআরডভিলকক্স: ক্রিপটিক ওয়ান-লাইনার খারাপ, ঘোষিত ওয়ান-লাইনার ভাল। কোনও কারণ নেই (কমপক্ষে আমি একটি দেখতে পাচ্ছি না), কেন একটি একক ফাংশন কলে একটি ফাইল (যেমন সাধারণ প্রয়োজন) পড়ার জন্য কেন কোনও ফাংশন মোড়ক নেই। কিছু একটা contents = os.readfile(path)। আমি যদি কিছু ফ্যানসিয়ার করতে চাইতাম তবে ঠিক আছে, আমি আনন্দের সাথে ব্যবহার করব with open(path) as fd: contents = fd.read()। অবশ্যই একটি তার নিজের র‍্যাপার লিখতে পারে, তবে প্রোগ্রামারগুলিকে বিমূর্তকরণের জন্য দরকারী সরবরাহ করার জন্য মূলটি এটিই।
টোকল্যান্ড

5
এটি সত্য যে কোডটি এটির চেয়ে অনেক বেশি পড়া হয়, তবে বোঝা যায় যে লম্বা কোডটি সংক্ষিপ্ত কোডের মতোই খুব ভাল আর ভুল হতে পারে না। আপনি যদি নিজের কোডটি যত তাড়াতাড়ি সংক্ষিপ্ত করে তুলতে সময় বিনিয়োগ করেন (বোঝার জন্য চতুর কৌশলগুলি অবলম্বন না করে), কোডটি পড়ার পরে সেই বিনিয়োগটি বার বার পরিশোধ করতে হবে। আপনার লিখিত প্রতিটি লাইন আপনার কোড পড়ার যে কারও জন্য বিরক্তি, তাই আপনার যতটা সম্ভব কম লেখার চেষ্টা করা উচিত। পাস্কালের বিখ্যাত উক্তিটি মনে রাখবেন: "আমি এই চিঠিটি কেবলমাত্র আরও দীর্ঘ করেছি কারণ এটিকে সংক্ষিপ্ত করার অবসর আমার নেই" "
জন উইলিয়ামস

উত্তর:


195

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

সুতরাং, আপনি এটিকে সংক্ষিপ্ত, সহজ এবং সুস্পষ্ট রাখতে কী করতে পারেন:

with open('pagehead.section.htm','r') as f:
    output = f.read()

এখন এটি মাত্র দুটি লাইন এবং বেশ পঠনযোগ্য, আমি মনে করি।


2
@ 1qazxsw2 আপনি যদি withবিবৃতিটি ব্যবহার করেন তবে ফাইলের উত্স আপনার জন্য সঠিকভাবে বন্ধ হয়ে যাবে।
ডেভিড আলবার

13
পুনরায় প্রথম বাক্য: পাইথন এটি শেষ পর্যন্ত বন্ধ করবে । তবে এর অর্থ এই নয় যে আপনার বন্ধ হওয়ার কথা ভুলে যাওয়া উচিত। এমনকি রি-কাউন্টিংয়ের পরেও ফাইলটি আপনি যা ভাবেন এবং চান তার চেয়ে বেশি দীর্ঘ উন্মুক্ত থাকতে পারে (উদাহরণস্বরূপ যদি এটি চক্র দ্বারা উল্লেখ করা হয়)। পাইথন বাস্তবায়নে এটি তিনবার যায় যার একটি শালীন জিসি থাকে, যেখানে কোনও নির্দিষ্ট সময়ে কোনও কিছুতেই জিসি'র নিশ্চয়তার কোনও গ্যারান্টি নেই। এমনকি সিপিথন ডকুমেন্টেশনও বলেছে যে এই ধরণের পরিষ্কারের জন্য আপনার জিসির উপর নির্ভর করা উচিত নয়। উত্তরের উত্তর অংশটি সাহসী হওয়া উচিত।

6
আপনার যদি সত্যিই ওয়ান-লাইনার প্রয়োজন হয় তবে output = f.read()অংশটি একই লাইনে পরে রাখা সম্ভব :
কার্ল নচেটেল

1
"কোডের 1 লাইনে একটি ফাইল পড়ুন এবং বন্ধ করুন" এটি দুটি লাইন এবং প্রশ্নের উত্তর দেয় না।
ব্যবহারকারীর 35359531

1
এটি বাস্তবায়ন নির্ভর - সোভেনের উত্তর দেখুন।
টিম পিটজ্যাকার

71

পাইথন স্ট্যান্ডার্ড লাইব্রেরি পাথলিব মডিউল আপনি যা খুঁজছেন তা করে:

Path('pagehead.section.htm').read_text()

পথ আমদানি করতে ভুলবেন না:

jsk@dev1:~$ python3
Python 3.5.2 (default, Sep 10 2016, 08:21:44)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> (Path("/etc") / "hostname").read_text()
'dev1.example\n'

পাইথন 27 এ ইনস্টল ব্যাকপোর্ট pathlibবাpathlib2


8
প্রস্তাবিত অন্যান্য উত্তরগুলি withঠিক আছে, তবে withএটি একটি বিবৃতি, কোনও অভিব্যক্তি নয়। এই pathlibউত্তরটি মূল প্রশ্নের একমাত্র উত্তর যা পাইথন এক্সপ্রেশনতে এম্বেড করা যেতে পারে। এরকম কিছুSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()
লিওরোচেল

24

সিপিথন ব্যবহার করে, আপনার ফাইলটি লাইনটি কার্যকর হওয়ার সাথে সাথেই বন্ধ হয়ে যাবে, কারণ ফাইল অবজেক্টটি অবিলম্বে আবর্জনা সংগ্রহ করা হয়েছে। দুটি ত্রুটি রয়েছে, যদিও:

  1. সিপথন থেকে পৃথক পাইথন বাস্তবায়নে, ফাইলটি প্রায়শই তাত্ক্ষণিকভাবে বন্ধ হয় না, বরং পরবর্তী সময়ে, আপনার নিয়ন্ত্রণের বাইরে।

  2. পাইথন ৩.২ বা তদূর্ধেরগুলিতে, এটি ResourceWarningসক্ষম করা থাকলে এটি ফেলে দেবে ।

একটি অতিরিক্ত লাইন বিনিয়োগ করা ভাল:

with open('pagehead.section.htm','r') as f:
    output = f.read()

এটি নিশ্চিত করবে যে ফাইলটি সমস্ত পরিস্থিতিতে সঠিকভাবে বন্ধ রয়েছে।


17

এটি করার জন্য কোনও বিশেষ গ্রন্থাগার আমদানি করার দরকার নেই।

সাধারণ বাক্য গঠন ব্যবহার করুন এবং এটি পড়ার জন্য ফাইলটি খুলবে এবং এটি বন্ধ করে দেবে।

with open("/etc/hostname","r") as f: print f.read() 

অথবা

with open("/etc/hosts","r") as f: x = f.read().splitlines()

যা আপনাকে রেখাগুলি সহ একটি অ্যারে এক্স দেয় এবং এর মতো মুদ্রণ করা যায়:

for line in x: print line

এই ওয়ান-লাইনারগুলি রক্ষণাবেক্ষণের জন্য খুব সহায়ক - মূলত স্ব-ডকুমেন্টিং।


8

আপনি যা করতে পারেন তা হল withবিবৃতিটি ব্যবহার করা এবং একটি লাইনে দুটি ধাপ লিখুন:

>>> with open('pagehead.section.htm', 'r') as fin: output = fin.read();
>>> print(output)
some content

withবিবৃতি কলে যত্ন নিতে হবে __exit__দেওয়া বস্তু এমনকি যদি খারাপ কিছু আপনার কোড ঘটেছে ফাংশন; এটি try... finallyসিনট্যাক্সের কাছাকাছি। বস্তু দ্বারা ফেরত জন্য open, __exit__ফাইল বন্ধ করার অনুরূপ।

এই বিবৃতি পাইথন 2.6 সঙ্গে চালু করা হয়েছে।


ছোট স্পষ্টকরণ: ডকুমেন্টেশন অনুযায়ী withপাইথন 2.5 তে প্রবর্তিত হয়েছিল, তবে স্পষ্টতই তা থেকে আমদানি করতে হয়েছিল __future__। এটি পাইথন ২.6 এর সমস্ত প্রসঙ্গ থেকে উপলব্ধ হয়ে উঠেছে।
ডেভিড আলবার

5

ইলিও ব্যবহার করুন : (ইনলাইন আইও):

ফাইল খোলার পরিবর্তে একটি ফাংশন কল (), পড়ুন (), বন্ধ ()।

from ilio import read

content = read('filename')

2
with open('pagehead.section.htm')as f:contents=f.read()

4
শীর্ষ 3 উত্তর থেকে এটি কীভাবে আলাদা?
সমস্ত কর্মী

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

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

1
এর 'কার্যকরভাবে' আলাদা কিনা তা বিবেচ্য নয়। python -cকমান্ড লাইনে ব্যবহার করা যেতে পারে এমন এক-লাইন সিনট্যাক্সের সন্ধানে আমি এই পৃষ্ঠায় পৌঁছেছি , সুতরাং 2-লাইনের উত্তর পোস্ট করা কোনও কাজে দেয় না।
ব্যবহারকারীর 35359531

1
@ user5359531 আমি আপনার বক্তব্যটি দেখতে পাচ্ছি না: আপনি কি জানেন যে আপনি পাইথন এক্সপ্রেশনগুলি উদ্ধৃত করতে পারেন ", ;দুটি নির্দেশ সংযোজন করতে ব্যবহার করতে পারেন , এবং পরে নতুন লাইন মুছতে পারেন :? নিম্নলিখিত $> python -c "with open('some file', 'r') as f: print(next(f))"
প্রকাশটি

2

আমি মনে করি এটি অর্জনের সর্বাধিক প্রাকৃতিক উপায়টি কোনও ফাংশনকে সংজ্ঞায়িত করা।

def read(filename):
    f = open(filename, 'r')
    output = f.read()
    f.close()
    return output

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

output = read('pagehead.section.htm')

0

আমি প্রায়শই এই জাতীয় কিছু করি যখন আমার লগ ফাইলটিতে কিছুটা গ্রেপ হওয়া কিছুকে ঘিরে কয়েকটি লাইন পাওয়া দরকার:

$ grep -n "xlrd" requirements.txt | awk -F ":" '{print $1}'
54

$ python -c "with open('requirements.txt') as file: print ''.join(file.readlines()[52:55])"
wsgiref==0.1.2
xlrd==0.9.2
xlwt==0.7.5

1
সম্পূর্ণ আসল বিষয় সম্পর্কহীন, কিন্তু আপনি মধ্যে হওয়া উচিত grep -A <n>, grep -B <n>এবং grep -C <n>, যদি সহায়ক। আরও তথ্য: স্ট্যাকওভারফ্লো.com
লিয়াম স্ট্যানলি

0

ব্যবহার করে more_itertools.with_iter, outputএক লাইনে সমমানের খুলতে, পড়তে, বন্ধ করতে এবং নির্ধারণ করা সম্ভব হয় (আমদানির বিবৃতি বাদে):

import more_itertools as mit


output = "".join(line for line in mit.with_iter(open("pagehead.section.htm", "r")))

যদিও সম্ভব, আমি কোনও ফাইলের বিষয়বস্তু কোনও ভেরিয়েবলের জন্য বরাদ্দকরণ ব্যতীত অন্য কোনও পদ্ধতির সন্ধান করব, অর্থাৎ অলস পুনরাবৃত্তি - এটি একটি traditional withতিহ্যবাহী ব্লক ব্যবহার করে বা উপরের উদাহরণে অপসারণ join()এবং পুনরাবৃত্তি দ্বারা করা যেতে পারে output


আপনি অনলাইনারের অভ্যন্তরেও আমদানি করতে পারেন। "".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))এটি ঠিক কাজ করে এবং আমদানির জন্য একটি লাইনের প্রয়োজনীয়তা দূর করে।
মেলওয়িল

1
আমি আপনার সাথে একমত। অনেলাইনারদের সাথে কাজগুলি সমাধান করার বিষয়ে আলোচনা করার সময়, আমি প্রায়শই নিজেকে যুক্তিগুলির মধ্যে খুঁজে পেয়েছি যেখানে সম্মত ফলাফলটি একটি একক লাইন কোডের তাজা অজগর শেলের মধ্যে দেওয়া উচিত। এই জাতীয় চ্যালেঞ্জগুলি খুব কমই পেপ 8 এর সাথে সামঞ্জস্য হয়। কোড লেখার পক্ষে এটি কোনওভাবেই ভাল অনুশীলন নয়, এটি কেবলমাত্র আমদানির প্রয়োজনীয়তা অপসারণের পরামর্শ হিসাবে বোঝানো হয়েছিল।
মেলওয়িল

0

আপনি যে উষ্ণ এবং অস্পষ্ট অনুভূতি চান শুধু সঙ্গে যেতে দিয়ে

অজগর 3.6 এর জন্য আমি এই দুটি প্রোগ্রাম আইডিএলএর একটি নতুন শুরুতে চালিয়েছি, এর রানটাইম দিয়েছি:

0.002000093460083008  Test A
0.0020003318786621094 Test B: with guaranteed close

তাই খুব একটা পার্থক্য নয়।

#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Test A for reading a text file line-by-line into a list
#--------*---------*---------*---------*---------*---------*---------*---------*

import sys
import time

#                                  # MAINLINE
if __name__ == '__main__':
    print("OK, starting program...")

    inTextFile = '/Users/Mike/Desktop/garbage.txt'

#                                  # Test: A: no 'with;
    c=[]
    start_time = time.time()
    c = open(inTextFile).read().splitlines()
    print("--- %s seconds ---" % (time.time() - start_time))

    print("OK, program execution has ended.")
    sys.exit()                     # END MAINLINE

আউটপুট:

OK, starting program...
--- 0.002000093460083008 seconds ---
OK, program execution has ended.

#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Test B for reading a text file line-by-line into a list
#--------*---------*---------*---------*---------*---------*---------*---------*

import sys
import time

#                                  # MAINLINE
if __name__ == '__main__':
    print("OK, starting program...")

    inTextFile = '/Users/Mike/Desktop/garbage.txt'

#                                  # Test: B: using 'with'
    c=[]
    start_time = time.time()
    with open(inTextFile) as D: c = D.read().splitlines()
    print("--- %s seconds ---" % (time.time() - start_time))

    print("OK, program execution has ended.")
    sys.exit()                     # END MAINLINE

আউটপুট:

OK, starting program...
--- 0.0020003318786621094 seconds ---
OK, program execution has ended.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.