पायथन के साथ एक फ़ाइल के लिए एक सूची लिखना


673

क्या यह किसी फ़ाइल में सूची लिखने का सबसे साफ़ तरीका है, क्योंकि writelines()इसमें नए वर्ण सम्मिलित नहीं हैं?

file.writelines(["%s\n" % item  for item in list])

ऐसा लगता है कि एक मानक तरीका होगा ...


37
ध्यान दें कि writelinesयह नई दर्पण को नहीं जोड़ता क्योंकि यह दर्पण है readlines, जो उन्हें हटाता भी नहीं है।
सिंगलएजिनेशन इलेक्शन

जवाबों:


909

आप एक लूप का उपयोग कर सकते हैं:

with open('your_file.txt', 'w') as f:
    for item in my_list:
        f.write("%s\n" % item)

पायथन 2 में, आप भी उपयोग कर सकते हैं

with open('your_file.txt', 'w') as f:
    for item in my_list:
        print >> f, item

यदि आप किसी एकल फ़ंक्शन कॉल के लिए उत्सुक हैं [], तो कम से कम चौकोर कोष्ठक हटा दें , ताकि प्रिंट किए जाने वाले तार एक समय में एक हो जाएं (एक सूची के बजाय एक जीनएक्सपी) - सभी आवश्यक मेमोरी लेने का कोई कारण नहीं तार की पूरी सूची तैयार करने के लिए।


7
यह बहुत जटिल नहीं है, लेकिन केवल अचार या जूस का उपयोग क्यों न करें ताकि आपको क्रमांकन और निरंकुशता के बारे में चिंता न करनी पड़े?
जेसन बेकर

82
उदाहरण के लिए क्योंकि आप एक आउटपुट टेक्स्ट फ़ाइल चाहते हैं जिसे प्रति पंक्ति एक आइटम के साथ आसानी से पढ़ा, संपादित किया जा सकता है, आदि। शायद ही एक दुर्लभ इच्छा; ;-)
एलेक्स मार्टेली

1
मैंने पाया कि पहले एक में \ n पायथन 2.7 / विंडोज पर बेमानी था
जॉर्ज रोड्रिग्ज

11
यह अंत में एक अतिरिक्त न्यूलाइन चरित्र लिखेगा ... लूप के बजाय, आप बस लिख सकते हैंthefile.write('\n'.join(thelist))
Tgsmith61591

3
मैं जोड़ूंगा: "सूची डेटाटाइप के साथ सावधान रहें"। मुझे कुछ अजीब परिणाम मिल रहे थे, शायद यह किसी की मदद कर सकता है:thefile.write(str(item) + "\n")
iipr

383

आप फ़ाइल के साथ क्या करने जा रहे हैं? क्या यह फ़ाइल मनुष्यों के लिए, या अन्य कार्यक्रमों के लिए मौजूद है जो स्पष्ट अंतर-आवश्यकताओं के साथ हैं?

यदि आप केवल उसी अजगर ऐप द्वारा बाद में उपयोग के लिए डिस्क को क्रमबद्ध करने की कोशिश कर रहे हैं, तो आपको सूची को चुनना चाहिए ।

import pickle

with open('outfile', 'wb') as fp:
    pickle.dump(itemlist, fp)

इसे वापस पढ़ने के लिए:

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)

35
+1 - जब अजगर ने क्रमबद्ध रूप से निर्मित किया है तो पहिए को क्यों मजबूत करें?
जेसन बेकर

20
+1 - open( "save.p", "wb" )open( "save.p", "rb" )
संगठन

2
समस्या यह है कि सूची को स्मृति में फिट होना चाहिए। यदि यह मामला नहीं है, तो लाइन द्वारा लाइन वास्तव में एक संभावित रणनीति है (या कुछ विकल्प के साथ जा रही है जैसा कि stackoverflow.com/questions/7180212/… ) में है
फिलिप्पो मज़ज़ा

1
यदि आप "ValueError: असुरक्षित स्ट्रिंग अचार" प्राप्त करते हैं, तो पायथन 2 में 'r' के बजाय 'r' का उपयोग करें, जब आप "ValueError: असुरक्षित स्ट्रिंग अचार"
queise

1
@serafeim: नहीं; with:ब्लॉक के अगले बयान के बाहर करने के लिए जारी रखने से पहले फ़ाइल बंद हो जाएगा withब्लॉक।
सिंगलएनजेशन इलिमिनेशन

285

सरल तरीका है:

with open("outfile", "w") as outfile:
    outfile.write("\n".join(itemlist))

आप यह सुनिश्चित कर सकते हैं कि आइटम सूची में सभी आइटम एक जनरेटर अभिव्यक्ति का उपयोग करके तार हैं:

with open("outfile", "w") as outfile:
    outfile.write("\n".join(str(item) for item in itemlist))

याद रखें कि सभी itemlistसूची को मेमोरी में रखने की आवश्यकता है, इसलिए, मेमोरी खपत के बारे में ध्यान रखें।


23
कोई अनुगामी न्यूलाइन नहीं है, लूप की तुलना में 2x स्थान का उपयोग करता है।
डेव

7
बेशक पहला सवाल जो मन को भाता है कि ओपी को एक नई पंक्ति में समाप्त होने की आवश्यकता है या नहीं और अंतरिक्ष मामलों की मात्रा है या नहीं। आप जानते हैं कि वे समय से पहले अनुकूलन के बारे में क्या कहते हैं।
जेसन बेकर

15
एक नकारात्मक पक्ष: यह उनमें से कोई भी लिखने से पहले मेमोरी में फ़ाइल के लिए संपूर्ण सामग्री का निर्माण करता है, इसलिए पीक मेमोरी का उपयोग अधिक हो सकता है।
रॉब

4
मुझे यह काम करने के लिए कभी नहीं मिल सकता है। मुझे यह त्रुटि मिलती है: "टेक्स्ट = '\ n'.join (namelist) +' \ n 'टाइपError: अनुक्रम आइटम 0: अपेक्षित स्ट्रिंग, सूची मिली"
Dan

2
आपको यह सुनिश्चित करना है कि 'namelist' में सभी तत्व तार हैं।
ऑसेंटाना

94

पायथन 3 और पायथन 2.6+ सिंटैक्स का उपयोग करना :

with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}\n".format(item))

यह प्लेटफॉर्म-स्वतंत्र है। यह एक नई लाइन चरित्र के साथ अंतिम पंक्ति को भी समाप्त करता है, जो एक यूनिक्स सबसे अच्छा अभ्यास है

पायथन 3.6 के साथ शुरू, "{}\n".format(item)एक एफ-स्ट्रिंग के साथ बदला जा सकता है f"{item}\n":।


मैं अंतिम आइटम के लिए "\ n" जोड़ना नहीं चाहता, क्या करना है? न चाहते हैं, तो हालत
PYD

4
@pyd लूप के लिए बदलेंfile_handler.write("\n".join(str(item) for item in the_list))
orluke

88

फिर भी एक और तरीका। का उपयोग कर json को क्रमानुसार simplejson (के रूप में शामिल json अजगर 2.6 में):

>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()

यदि आप आउटपुट की जांच करते हैं।

[१, २, ३, ४]

यह उपयोगी है क्योंकि वाक्य रचना pythonic है, यह मानव पठनीय है, और इसे अन्य भाषाओं में अन्य कार्यक्रमों द्वारा पढ़ा जा सकता है।


39

मैंने सोचा कि एक जीनएक्सपी का उपयोग करने के लाभों का पता लगाना दिलचस्प होगा, इसलिए यहां मेरा लेना है।

प्रश्न में उदाहरण एक अस्थायी सूची बनाने के लिए वर्ग कोष्ठक का उपयोग करता है, और इसलिए इसके बराबर है:

file.writelines( list( "%s\n" % item for item in list ) )

जो अनावश्यक रूप से उन सभी लाइनों की एक अस्थायी सूची का निर्माण करता है, जो बाहर लिखी जाएँगी, इससे आपकी सूची के आकार और कैसे के क्रिया के आधार पर महत्वपूर्ण मात्रा में मेमोरी का उपभोग हो सकता str(item)है।

वर्ग कोष्ठक ड्रॉप (समकक्ष रैपिंग को दूर करने के list()बजाय एक अस्थायी पारित करेंगे ऊपर कॉल) जनरेटर के लिए file.writelines():

file.writelines( "%s\n" % item for item in list )

यह जनरेटर itemऑन-डिमांड (यानी जैसा कि वे लिखे गए हैं) में आपकी वस्तुओं की नई-अवधि-निरूपित प्रतिनिधित्व बनाएंगे । यह कुछ कारणों से अच्छा है:

  • मेमोरी ओवरहेड्स छोटे होते हैं, यहां तक ​​कि बहुत बड़ी सूची के लिए भी
  • यदि str(item)धीमी है तो फ़ाइल में प्रगति दिखाई दे रही है क्योंकि प्रत्येक आइटम संसाधित है

यह स्मृति समस्याओं से बचता है, जैसे:

In [1]: import os

In [2]: f = file(os.devnull, "w")

In [3]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 385 ms per loop

In [4]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.

Traceback (most recent call last):
...
MemoryError

(मैंने पायथन की अधिकतम वर्चुअल मेमोरी को ~ 100MB के साथ सीमित करके इस त्रुटि को ट्रिगर किया है ulimit -v 102400)।

स्मृति उपयोग को एक तरफ रखना, यह विधि वास्तव में मूल से अधिक तेज़ नहीं है:

In [4]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 370 ms per loop

In [5]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
1 loops, best of 3: 360 ms per loop

(लिनक्स पर पायथन 2.6.2)


20

क्योंकि मैं आलसी हूँ ...।

import json
a = [1,2,3]
with open('test.txt', 'w') as f:
    f.write(json.dumps(a))

#Now read the file back into a Python list object
with open('test.txt', 'r') as f:
    a = json.loads(f.read())

क्या सूची क्रमिक हैं?
kRazzy R

1
हाँ वास्तव में, वे हैं!
कमांडोस्कॉर्च

1
आयात json; test_list = [1,2,3]; list_as_a_string = json.dumps (test_list); #list_as_a_string अब स्ट्रिंग है '[1,2,3]'
CommandoScorch

मैं यह कर रहा हूं with open ('Sp1.txt', 'a') as outfile: json.dump (sp1_segments, outfile) logger.info ("Saved sp_1 segments"); समस्या है मेरा कार्यक्रम तीन बार चलता है, और तीन रनों से परिणाम गड़बड़ हो रहे हैं। क्या 1-2 रिक्त रेखाओं को जोड़ने का कोई तरीका है ताकि प्रत्येक रन से परिणाम समझ में आएं?
krazzy आर

1
पूर्ण रूप से! क्या आप इसके बजाय कर सकते हैं json.dump(sp1_segments + "\n\n", outfile)?
CommandoScorch

19

अल्पविराम के साथ पाठ फ़ाइल में सूची को अलग करें

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )

14

सामान्य रूप में

निम्नलिखित लेखनी () विधि के लिए वाक्यविन्यास है

fileObject.writelines( sequence )

उदाहरण

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "rw+")
seq = ["This is 6th line\n", "This is 7th line"]

# Write sequence of lines at the end of the file.
line = fo.writelines( seq )

# Close opend file
fo.close()

संदर्भ

http://www.tutorialspoint.com/python/file_writelines.htm


13
file.write('\n'.join(list))

1
एक को ध्यान देना चाहिए कि इसके लिए यह आवश्यक होगा कि फाइल को टेक्स्ट के रूप में सही मायने में प्लेटफॉर्म-न्यूट्रल बनाया जाए।
जेसन बेकर

2
आपको fileचर कैसे मिलेगा ?
जोनाथन मोरालेस वेलेज


7

यदि आप निम्नानुसार python3 पर हैं, तो आप प्रिंट फ़ंक्शन का भी उपयोग कर सकते हैं।

f = open("myfile.txt","wb")
print(mylist, file=f)

क्या यह केवल myfile.txt में एक लाइन नहीं डालता, कुछ इस तरह है: [, a ’, put b’, 'c ’] प्रत्येक पंक्ति पर a, b, c लिखने के बजाय।
हैरी डूंग


2

यह तर्क पहले आइटम को सूची में परिवर्तित करेगा string(str)। कभी-कभी सूची में टपल जैसी होती है

alist = [(i12,tiger), 
(113,lion)]

यह तर्क प्रत्येक टपल को एक नई पंक्ति में दर्ज करने के लिए लिखेगा। evalफ़ाइल को पढ़ते समय हम प्रत्येक टपल को लोड करते समय उपयोग कर सकते हैं :

outfile = open('outfile.txt', 'w') # open a file in write mode
for item in list_to_persistence:    # iterate over the list items
   outfile.write(str(item) + '\n') # write to the file
outfile.close()   # close the file 

1

पुनरावृत्ति और जोड़ने का एक और तरीका है:

for item in items:
    filewriter.write(f"{item}" + "\n")

1

अजगर> 3 में आप उपयोग कर सकते हैं printऔर *तर्क अनपैकिंग के लिए:

with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)

-2

में python3 आप इस पाश का उपयोग कर सकते

with open('your_file.txt', 'w') as f:
    for item in list:
        f.print("", item)

-3

बता दें कि सूची में एग है, फिर:

In [29]: a = n.array((avg))
In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')

आप अपनी आवश्यकता के अनुसार उपयोग %eया %sनिर्भर कर सकते हैं।


-4
poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''
f = open('poem.txt', 'w') # open for 'w'riting
f.write(poem) # write text to file
f.close() # close the file

यह कैसे काम करता है: सबसे पहले, बिल्ट-इन ओपन फ़ंक्शन का उपयोग करके by le खोलें और fi le का नाम और उस मोड को निर्दिष्ट करें जिसमें हम। Le को खोलना चाहते हैं। मोड एक रीड मोड ('आर'), राइट मोड ('डब्ल्यू') या एपेंड मोड ('ए') हो सकता है। हम यह भी निर्दिष्ट कर सकते हैं कि क्या हम पाठ मोड ('t') या बाइनरी मोड ('b') में पढ़ रहे हैं, लिख रहे हैं या जोड़ रहे हैं। वास्तव में कई और मोड उपलब्ध हैं और मदद (ओपन) आपको उनके बारे में अधिक जानकारी देगी। डिफ़ॉल्ट रूप से, ओपन (), le को 't'ext opens le मानता है और इसे' r'ead 'मोड में खोलता है। हमारे उदाहरण में, हम use le को टेक्स्ट मोड में लिखते हैं और to le ऑब्जेक्ट के लिखने की विधि का उपयोग fi le पर लिखते हैं और फिर हम। Le को बंद करते हैं।

उपरोक्त उदाहरण स्वरुप C H. swaroopch.com की पुस्तक "ए बाइट ऑफ़ पायथन" से है


5
यह एक फ़ाइल को एक स्ट्रिंग लिखता है, न कि एक सूची (तार का) जो कि ओपी पूछता है
giveman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.