python - फ़ाइल में लाइन लिखने का सही तरीका?




file-io (6)

आपको print() फ़ंक्शन का उपयोग करना चाहिए जो Python 2.6+ के बाद उपलब्ध है

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

पायथन 3 के लिए आपको import आवश्यकता नहीं है, क्योंकि print() फ़ंक्शन डिफ़ॉल्ट है।

विकल्प का उपयोग करना होगा:

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

न्यूलाइन के बारे में पाइथन दस्तावेज से उद्धरण:

आउटपुट पर, यदि न्यूलाइन कोई नहीं है, तो लिखा गया कोई भी '\n' वर्ण सिस्टम डिफ़ॉल्ट लाइन विभाजक, os.linesep । यदि नई लाइन '' , तो कोई अनुवाद नहीं होता है। यदि न्यूलाइन अन्य कानूनी मानों में से कोई है, तो लिखे गए किसी भी '\n' वर्णों को दिए गए स्ट्रिंग में अनुवादित किया जाता है।

मैं print >>f, "hi there" करने के लिए प्रयोग किया जाता है print >>f, "hi there"

हालांकि, ऐसा लगता है कि print >> बहिष्कृत हो रहा है। ऊपर की रेखा को करने का अनुशंसित तरीका क्या है?

अद्यतन : उन सभी उत्तरों के बारे में "\n" ... यह सार्वभौमिक या यूनिक्स-विशिष्ट है? आईई, क्या मुझे विंडोज़ पर "\r\n" करना चाहिए?


जब आपने लाइन कहा तो इसका मतलब कुछ धारावाहिक वर्ण हैं जो '\ n' वर्णों के लिए समाप्त हो जाते हैं। रेखा किसी बिंदु पर आखिरी होनी चाहिए ताकि हमें प्रत्येक पंक्ति के अंत में '\ n' पर विचार करना चाहिए। यहां समाधान है:

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write('Hello')

यदि आप 'डब्ल्यू' मोड का उपयोग करना चाहते हैं, तो प्रत्येक कर्सर को नई पंक्ति में ले जाने के बाद मोड को संशोधित करें, आपको लिखने के अंत में '\ n' वर्ण जोड़ना चाहिए:

the_file.write('Hello'+'\n')

मुझे नहीं लगता कि एक "सही" तरीका है।

मै इस्तेमाल करूंगा:

with open ('myfile', 'a') as f: f.write ('hi there\n')

यादगार टिम Toady में


यदि आप बहुत सारे डेटा और गति लिख रहे हैं तो चिंता है कि आपको शायद f.write(...) साथ जाना चाहिए। मैंने त्वरित गति तुलना की और यह बड़ी संख्या में लिखने के दौरान print(..., file=f) से काफी तेज था।

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

औसत मशीन पर मेरी मशीन पर 2.45 एस में समाप्त हुआ, जबकि print में लगभग 4 गुना लंबा (9 76) लिया गया। कहा जा रहा है कि, अधिकांश वास्तविक दुनिया परिदृश्य में यह कोई मुद्दा नहीं होगा।

यदि आप print(..., file=f) साथ जाना चुनते हैं तो आपको शायद पता चलेगा कि आप समय-समय पर नई लाइन को दबाना चाहते हैं, या इसे किसी अन्य चीज़ से बदलना चाहते हैं। यह वैकल्पिक end पैरामीटर सेट करके किया जा सकता है, उदाहरण के लिए;

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

जिस भी तरीके से आप चुनते हैं, मैं इसका उपयोग with का सुझाव दूंगा क्योंकि यह कोड को पढ़ने में बहुत आसान बनाता है।

अद्यतन : प्रदर्शन में यह अंतर इस तथ्य से समझाया गया है कि write लिए वास्तव में write जाता है और डिस्क पर किसी भी लिखने से पहले रिटर्न देता है ( यह जवाब देखें), जबकि print (संभवतः) लाइन बफरिंग का उपयोग करता है। इसके लिए एक सरल परीक्षण लंबे समय तक लिखने के लिए प्रदर्शन की जांच करना होगा, जहां लाइन बफरिंग के लिए नुकसान (गति के मामले में) कम स्पष्ट होगा।

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

प्रदर्शन अंतर अब write लिए 2.20 के औसत समय और print लिए 3.10 के औसत के साथ बहुत कम स्पष्ट हो जाता है। यदि आपको इस लूंग लाइन प्रदर्शन को भुगतने के लिए स्ट्रिंग्स का एक समूह जोड़ना होगा, तो ऐसे मामलों का उपयोग करें जहां print अधिक कुशल होगा, थोड़ा दुर्लभ होगा।


पायथन दस्तावेज़ इस तरह की सिफारिश करते हैं:

with open('file_to_write', 'w') as f:
    f.write('file contents')

तो यह वही तरीका है जो मैं करता हूं :)

Docs.python.org से कथन :

फ़ाइल ऑब्जेक्ट्स से निपटने के दौरान 'साथ' कीवर्ड का उपयोग करना अच्छा अभ्यास है। इसका लाभ यह है कि फ़ाइल सूट खत्म होने के बाद ठीक से बंद हो जाती है, भले ही एक अपवाद उठाया गया हो। यह बराबर प्रयास अंततः ब्लॉक लिखने से भी बहुत छोटा है।


Os.linesep के बारे में:

यहां विंडोज़ पर एक सटीक unedited पायथन 2.7.1 दुभाषिया सत्र है:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

विंडोज़ पर:

जैसा कि अपेक्षित है, os.linesep उसी परिणाम को '\n' रूप में उत्पन्न नहीं करता है। ऐसा कोई रास्ता नहीं है कि यह एक ही परिणाम उत्पन्न कर सके। 'hi there' + os.linesep 'hi there\r\n' बराबर है, जो 'hi there\n' बराबर नहीं है

यह आसान है: \n उपयोग करें जिसका स्वचालित रूप से os.linesep में अनुवाद किया जाएगा। और विंडोज़ के पाइथन के पहले बंदरगाह के बाद से यह इतना आसान रहा है।

गैर-विंडोज सिस्टम पर os.linesep का उपयोग करने में कोई बात नहीं है, और यह विंडोज पर गलत परिणाम उत्पन्न करता है।

ओएसलिनेस का उपयोग न करें!





file-io