फाइल करने के लिए लाइन लिखने का सही तरीका?


1069

मुझे करने की आदत है print >>f, "hi there"

हालांकि, ऐसा लगता है कि print >>पदावनत हो रही है। उपरोक्त पंक्ति को करने का अनुशंसित तरीका क्या है?

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


11
"n" विशिष्ट नहीं है। जब फ़ाइल पाठ मोड (डिफ़ॉल्ट) में खोली जाती है, तो यह स्वचालित रूप से वर्तमान प्लेटफ़ॉर्म के लिए समाप्त होने वाली सही लाइन में अनुवादित होती है। "\ R \ n" लिखने से "\ r \ r \ n" उत्पन्न होगा जो गलत है।
डी कोएट्जी

बस आंसू कोड (10 सबसे UNIX सिस्टम पर) देखने के लिए प्रिंट ऑर्ड (os.linesep) स्टेटमेंट जोड़ें
स्टीफन ग्रुएनवाल्ड

आपको क्यों लगता है कि यह पदावनत है?
xxx ---

जवाबों:


1152

यह उतना ही सरल होना चाहिए:

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

दस्तावेज़ से:

os.linesepपाठ मोड में खोली गई फ़ाइलों को लिखते समय लाइन टर्मिनेटर के रूप में उपयोग न करें (डिफ़ॉल्ट); सभी प्लेटफार्मों पर इसके बजाय एकल '\ n' का उपयोग करें।

कुछ उपयोगी पढ़ने:

  • withकथन
  • open()
    • 'ए' एपेंड, या उपयोग के लिए है
    • tr डब्ल्यू ’ट्रंकेशन के साथ लिखने के लिए
  • os(विशेषकर os.linesep)

36
यह उदाहरण खुले / करीबी उदाहरण से बेहतर है। का उपयोग करते हुए withएक सुरक्षित तरीका है एक फ़ाइल को बंद करने के लिए याद करने के लिए।
ईयाल

18
मुझे फोन नहीं करना है the_file.close()?
हुसैन

19

@Johnsyweb आप यह क्यों कहते हैं "os.linesep। ओएस में बहुत अच्छा सामान है?", जब आप पहले पोस्ट में उपयोग करने के खिलाफ सिफारिश की है? मुझे यहां एक संपादन पर संदेह है, और यह डाउन वोटों का कारण हो सकता है।
हॉर्स स्मीथ

1
@ user3226167: यह एक दिलचस्प बिंदु है। लेकिन आप प्लेन टेक्स्ट लिखने के लिए बाइनरी फाइल क्यों खोलेंगे?
जॉनसीवेब

961

आपको print()फ़ंक्शन का उपयोग करना चाहिए जो कि पायथन 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। यदि न्यूलाइन है '', तो कोई अनुवाद नहीं होता है। यदि newline अन्य कानूनी मूल्यों में से कोई है, तो '\n'लिखे गए किसी भी अक्षर को दिए गए स्ट्रिंग में अनुवादित किया जाता है।


35
-1 "यदि आप निश्चित होना चाहते हैं, तो इसके बजाय os.linesep को स्ट्रिंग में जोड़ें \n" के लिए newline = "" की आवश्यकता होगी अन्यथा आप \r\r\nविंडोज से प्राप्त करेंगे । वहाँ os.linesep के साथ के बारे में सब करने के लिए कोई कारण नहीं है।
जॉन माकिन

7
@ सोरीन: लेखन मोड जोड़ने के लिए आपका संपादन निश्चित रूप से एक सुधार है। हालाँकि आप अजीब तरह से os.linesep के बारे में अडिग रहते हैं। मेरा जवाब देखिए। वैसे, आपके द्वारा उद्धृत दस्तावेज़ 3.x के लिए है, लेकिन यह भाग पाठ मोड में 2.x के लिए भी मान्य है: किसी भी '\ n' वर्ण को सिस्टम डिफ़ॉल्ट लाइन विभाजक, os.linesep * में अनुवादित किया जाता है । .. Windows: लेखन os.linesep लेखन के समान है \r\nजिसमें शामिल है \nजिसका अनुवाद os.linesep में किया जाता है जो \r\nकि अंतिम परिणाम है \r\r\n
जॉन माचिन

7
@ जो आप सही थे, मैंने os.linesep बग को ठीक किया। धन्यवाद।
सोरिन

3
इसके open('myfile','a')बजाय इसे जोड़ने के लिए नहीं है open('myfile','w')?
नेडार्क

6
@BradRuderman यह एक पाठ फ़ाइल में एक "लाइन" बनाने के लिए POSIX मानक का हिस्सा है , अर्थात पाठ फ़ाइल में प्रत्येक पंक्ति को एक नई पंक्ति, यहां तक ​​कि अंतिम पंक्ति द्वारा समाप्त किया जाना चाहिए।
पहिएदार

116

अजगर डॉक्स इस तरह की सिफारिश:

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

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

Docs.python.org से बयान :

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


1
मुझे इस तरह से पसंद नहीं है जब मुझे withएक लूप के अंदर घोंसला बनाने की आवश्यकता होती है । जैसा कि मैंने अपने लूप में आगे बढ़ते हुए फाइल को लगातार खोला और बंद किया। शायद मैं यहाँ कुछ याद कर रहा हूँ, या यह वास्तव में इस विशेष परिदृश्य में एक नुकसान है?
सिबस जुआ

38
कैसे के साथ पाशन के साथ?
j7nn7k

@ j7nn7k for fd में लाइन के लिए:
मोमेंटोच

86

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

यहाँ विंडोज पर एक सटीक संयुक्त पायथन 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 का उपयोग करने का कोई मतलब नहीं है, और यह विंडोज पर गलत परिणाम पैदा करता है।

OS.linesep का उपयोग न करें!


महान उदाहरण - जिज्ञासु यदि आप एक ipython उपयोगकर्ता हैं? सत्रों को प्रारूपित करने के लिए अच्छे कार्य
एल्विन

मुझे पूरी तरह से यकीन नहीं है कि आप हमें यहां बताने की कोशिश कर रहे हैं। os.linesep ऑपरेटिंग सिस्टम द्वारा परिभाषित लाइन टर्म कैरेक्टर (या स्ट्रिंग) को लौटाएगा। विंडोज डिफ़ॉल्ट रूप से लाइन एंडिंग के लिए \ r \ n का उपयोग करता है। हालाँकि, एक एकल \ n मान्यता प्राप्त है। \ N का उपयोग करना पूरी तरह से पोर्टेबल OUTPUT देने वाला है लेकिन विंडोज़ पर os.linesep गलत नहीं है।
गुस्सोर

5
@Gusdor: मुद्दा यह है कि यदि आप स्पष्ट रूप os.linesepसे पाठ मोड में विंडोज में उपयोग करते हैं , तो परिणाम \r\r\nगलत है। "विंडोज़ उपयोग करता है ..." अर्थहीन है। C रनटाइम लाइब्रेरी (और इसलिए पायथन) टेक्स्ट मोड में आउटपुट पर ट्रांसलेट \nहोती \r\nहै। अन्य सॉफ़्टवेयर अलग तरीके से व्यवहार कर सकते हैं। यह ऐसा नहीं है कि विंडोज पर चलने वाले सभी सॉफ्टवेयर \nटेक्स्ट मोड में पढ़ते समय एक लाइन विभाजक के रूप में एक लोन को पहचानते हैं । अजगर करता है। Microsoft का नोटपैड टेक्स्ट एडिटर नहीं है।
जॉन मैकिन

6
यकीनन कोई और इसे पढ़ रहा होगा, आप नहीं, कुछ मिक्की-माउस सॉफ्टवेयर के साथ जो अतिरिक्त के बारे में बताएगा \r...
जॉन मैकिन

2
@Gusdor आप एक अलग भाषा से अजगर पर आ रहे हैं, जहां '\ n' के परिणाम का उपयोग विंडो पर '\ n' के बजाय '\ r \ n' के परिणाम के रूप में होता है - इसलिए इसमें '' r '' का अभाव है पाठ संपादकों? जैसा कि जॉन कहते हैं, यह नहीं है कि पायथन कैसे व्यवहार करता है - '\ n' की जगह स्वतः ही बदल जाती है, यदि ऐसा करने के लिए os.linesep कहता है। इसलिए, यहाँ स्पष्ट रूप os.linesep से "गलत" कहा जा रहा है । इसकी तरह Department of Redundancy Department। हां तुम यह कर सकते हो। नहीं, आप नहीं करना चाहते हैं।
टूलमेकरसैट

55

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

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

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

मेमोरियम में टिम टोडी


लेकिन ओपी फ़ाइल में अतिरिक्त सामान लिखना चाह सकता है। यहां withस्कोप से बाहर जाने पर फाइल बंद हो जाएगी ।
कीथ

हो सकता है कि open(..., 'a')या भी हो सकता है 'at'
mtrw

5
एर्म, हाँ। के साथ उपयोग करने का विचार है। यदि आप फ़ाइल को खुला रखना चाहते हैं, तो बस शुरुआत में खुला कॉल करें और काम पूरा होने पर पास
बुलाएँ

1
@mtrw। सच। ओपी अपील कर रहा था।
हाइपरबोरस

1
जहाँ तक अजगर का संबंध है RIP टिम टोडी - और बहुत बहुत सही तरीके से
Mr_and_Mrs_D

21

पायथन 3 में यह एक फ़ंक्शन है, लेकिन पायथन 2 में आप इसे स्रोत फ़ाइल के शीर्ष पर जोड़ सकते हैं:

from __future__ import print_function

फिर आप करते हैं

print("hi there", file=f)

17

यदि आप बहुत अधिक डेटा लिख ​​रहे हैं और गति एक चिंता का विषय है, जिसे आपको शायद जाना चाहिए 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)

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

यदि आप अपने साथ जाना चुनते हैं, 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अत्यधिक बफर होता है और डिस्क पर वास्तव में होने वाले किसी भी लिखने से पहले रिटर्न होता है ( यह उत्तर देखें ), जबकि 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")

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


10

3.5 के बाद से आप pathlibउस उद्देश्य के लिए भी उपयोग कर सकते हैं :

Path.write_text(data, encoding=None, errors=None)

टेक्स्ट मोड में बताई गई फ़ाइल खोलें, उस पर डेटा लिखें और फ़ाइल बंद करें:

import pathlib

pathlib.Path('textfile.txt').write_text('content')

5

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

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

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

the_file.write("Hello\n")

1
"एपेंड मोड में प्रत्येक लिखने के बाद कर्सर नई लाइन पर जाता है" - नहीं यह नहीं है।
एक से

3

एक के ioरूप में भी मॉड्यूल का उपयोग कर सकते हैं :

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)

1

फ्लास्क में किसी फाइल में टेक्स्ट लिखने के लिए इस्तेमाल किया जा सकता है:

filehandle = open("text.txt", "w")
filebuffer = ["hi","welcome","yes yes welcome"]
filehandle.writelines(filebuffer)
filehandle.close()

0

आप भी आजमा सकते हैं filewriter

pip install filewriter

from filewriter import Writer

Writer(filename='my_file', ext='txt') << ["row 1 hi there", "row 2"]

में लिखता है my_file.txt

__str__समर्थन के साथ एक चलने योग्य या एक वस्तु लेता है ।


0

जब मुझे नई लाइनें लिखने की आवश्यकता होती है, तो मैं एक लंबो को परिभाषित करता हूं जो एक printफ़ंक्शन का उपयोग करता है :

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

इस दृष्टिकोण का यह लाभ है कि यह उन सभी सुविधाओं का उपयोग कर सकता है जो इसके साथ उपलब्ध हैं print फ़ंक्शन के ।

अपडेट: जैसा कि टिप्पणी अनुभाग में जार्ज द्वारा उल्लेख किया गया है , इस विचार को partialफ़ंक्शन के साथ आगे सुधारना संभव है :

from functools import partial
fwl = partial(print, file=out)

IMHO, यह एक अधिक कार्यात्मक और कम गूढ़ दृष्टिकोण है।


2
या एक और (शायद क्लीनर) यह लिखने का तरीका from functools import partial; fwl = partial(print, file=out):।
जार्ज

@Georgy आपका दृष्टिकोण इतना अच्छा है कि इसे एक नए उत्तर के रूप में दिया जा सकता है।
MxNx

1
विचार आपके जैसा ही है, बस कार्यान्वयन थोड़ा अलग है। यदि आप चाहें, तो आप इसे अपने उत्तर में संपादित कर सकते हैं। मैं इसके साथ ठीक हूं।
जॉर्जी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.