पायथन सूची से मानों के साथ .csv फ़ाइल बनाएँ


182

मैं पायथन सूची से मानों के साथ एक .csv फ़ाइल बनाने का प्रयास कर रहा हूं। जब मैं सूची में मूल्यों को प्रिंट करता हूं तो वे सभी यूनिकोड (?) होते हैं, अर्थात वे कुछ इस तरह दिखते हैं

[u'value 1', u'value 2', ...]

अगर मैं सूची में मानों के माध्यम से पुनरावृति करता हूं, तो for v in mylist: print vवे सादे पाठ प्रतीत होते हैं।

और मैं ,प्रत्येक के बीच में रख सकता हूंprint ','.join(mylist)

और मैं एक फ़ाइल के लिए उत्पादन कर सकते हैं, यानी

myfile = open(...)
print >>myfile, ','.join(mylist)

लेकिन मैं एक सीएसवी के लिए उत्पादन करना चाहता हूं और सूची में मूल्यों के आसपास सीमांकक है

"value 1", "value 2", ... 

मैं प्रारूपण में सीमांकक को शामिल करने का एक आसान तरीका नहीं खोज सकता, जैसे मैंने joinबयान के माध्यम से कोशिश की है। मैं यह कैसे कर सकता हूँ?


सभी को धन्यवाद, मैंने अपने प्रश्न को हल करने के लिए कुछ उत्तरों से विचारों को संयुक्त किया है :) अब मैं एक फ़ाइल आयात करने के लिए सीएसवी मॉड्यूल का उपयोग करता हूं [...] सीधे फ़ाइल आयात सीएसवी डेटा = [...] मायफाइल = ओपन ( ..., 'wb') बाहर = csv.writer (खुला ("myfile.csv", "w"), सीमांकक = ',', = csv.QUOTE_ALL) out.writerow (डेटा) उद्धृत करते हुए अच्छी तरह से काम करता है, मैं निर्माण करता हूं मेरे डेटा [] xlrd का उपयोग करके एक स्प्रेडशीट के कुछ डेटा को हथियाने और सीएसवी मॉड्यूल ने इसे एक फाइल के साथ लिखा है जिसमें सभी सही
डेलिमिटर के साथ हैं

एक और हालिया दृष्टिकोण पांडा
रिचर्ड

पायथन 3.4 उपयोगकर्ता, इसने मेरे लिए सबसे अच्छा काम किया: stackoverflow.com/questions/25022677/…
लेह

जवाबों:


254
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

संपादित करें: यह केवल अजगर 2.x के साथ काम करता है

अजगर के साथ काम करने के लिए 3.x के wbसाथ बदलें w( इस SO का उत्तर देखें )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
ध्यान दें कि csv2.x में मॉड्यूल यूनिकोड के साथ ठीक से व्यवहार नहीं करता है; इससे निपटने के तरीके पर उदाहरण के लिए मॉड्यूल प्रलेखन देखें। docs.python.org/library/csv.html
इग्नासियो

14
आप wr.writerows (सूची)
tovmeod

4
राइटर्स सूची में प्रत्येक तत्व को स्तंभों में तोड़ता हुआ प्रतीत होता है यदि प्रत्येक तत्व एक सूची भी है। यह आउटपुट टेबल के लिए बहुत आसान है।
whatnick

6
यह अजगर 3.4 के साथ काम नहीं करता है। मैं हो रही है TypeError: 'str' does not support the buffer interface
बॉटनकियाक

1
पायथन 2 के लिए, 'w'यहाँ पर प्रयोग करें: stackoverflow.com/questions/34283178/…
banan3'14

106

यहाँ एलेक्स मार्टेली का एक सुरक्षित संस्करण है:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

3
प्लस 1 का उपयोग करने के लिए with, यह सुनिश्चित करने के लिए कि फ़ाइल बंद होने पर किया जाता है
BoltzmannBrain

अगर मैं इसे लूप के लिए उपयोग कर रहा हूं, तो क्या पूरे लूप के तहत ब्लॉक के साथ नेस्टेड होना चाहिए? या यह केवल wr.writerow(my_list)लूप के अंदर होने के लिए अधिक कुशल होगा ?
crypdick

1
@ क्रिप्टेडिक आपको निश्चित रूप से पूरे ब्लॉक को लूप में नहीं डालना चाहिए। फ़ाइल खोलें, फिर प्रत्येक पंक्ति को एक लूप में लिखें। N पंक्तियों को लिखने के लिए फ़ाइल को n बार खोलने की कोई आवश्यकता नहीं है।
ग्रेग कालेका

यदि आप किसी फ़ाइल में स्ट्रिंग ऑब्जेक्ट्स लिख रहे हैं, तो टाइपर से बचने के लिए फ़ाइल खोलने के दौरान 'wt' का उपयोग करने का सुझाव देंगे: बाइट्स जैसी ऑब्जेक्ट की आवश्यकता होती है, न कि 'str' की।
don_Gunner94

41

एक अन्य दृष्टिकोण के लिए, आप पांडा में डेटाफ़्रेम का उपयोग कर सकते हैं : और यह आसानी से डेटा को नीचे दिए गए कोड की तरह सीएसवी में डंप कर सकता है:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके शैक्षिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों के लिए समान रूप से उपयोगी होगा, लेकिन समान नहीं, प्रश्न। कृपया स्पष्टीकरण जोड़ने के लिए अपना उत्तर संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टोबे स्पाइट

5
इसके अलावा काम करने के लिए सूचियों की लंबाई समान होनी चाहिए, अन्यथा आपको एक मान प्राप्त होगा (पांडा v 0.22.0)
cheevahagadog

32

सबसे अच्छा विकल्प जो मैंने पाया है वह मॉड्यूलsavetxt से उपयोग कर रहा था :numpy

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

मामले में आपके पास कई सूचियाँ हैं जिन्हें स्टैक करने की आवश्यकता है

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

8
यह संख्यात्मक कार्य के लिए अच्छा है, लेकिन सूची में तार की विशेषता होने पर यह काम नहीं करेगा।
रिकार्डो क्रूज़

12

csvकॉमा या टैब-सीमांकित फ़ाइलों को पढ़ने और लिखने के लिए अजगर के मॉड्यूल का उपयोग करें । सीएसवी मॉड्यूल को प्राथमिकता दी जाती है क्योंकि यह आपको उद्धृत करने पर अच्छा नियंत्रण देता है।

उदाहरण के लिए, यहां आपके लिए काम किया गया उदाहरण है:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

पैदा करता है:

"value 1","value 2","value 3"

4
मेरे लिए एक खाली फाइल तैयार करता है
caspii

पहला रन खाली है और आप इसे तब हटा भी नहीं सकते, क्योंकि यह तब अजगर में खोला गया है। दूसरा रन (या अधिक सटीक: out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))यदि आप open("myfile.csv","w")कोई नई फ़ाइल डालते हैं, तो डेटा भरता है, ऐसा open("myfile2.csv","w")लगता है मानो आउट ऑब्जेक्ट रन पर बनी फ़ाइल ऑब्जेक्ट से निपट नहीं सकता है, लेकिन आउटपुट प्रक्रिया को टूडू के रूप में संग्रहीत करता है: आउट ऑब्जेक्ट पहले रन में फ़ाइल ऑब्जेक्ट को संग्रहीत करता है, लेकिन केवल तब लिखता है जब फ़ाइल ऑब्जेक्ट पहले से मौजूद है! @Saurabh Adhikary
Lorenz

7

आप इस स्थिति में string.join विधि का उपयोग कर सकते हैं।

स्पष्टता के लिए कुछ लाइनों पर विभाजित करें - यहां एक इंटरैक्टिव सत्र है

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

या एक ही पंक्ति के रूप में

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

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

सीएसवी मॉड्यूल आप के लिए यह सब की देखभाल कर सकते हैं, आप विभिन्न हवाले से विकल्पों के बीच चयन करने के लिए अनुमति (सभी क्षेत्रों, केवल उद्धरण और seperators, केवल गैर संख्यात्मक फ़ील्ड, आदि के साथ-प्रांगण) और कैसे Esacpe नियंत्रण charecters करने के लिए (डबल कोट, या बच गए तार)। यदि आपके मान सरल हैं, तो string.join शायद ठीक होगा, लेकिन यदि आप बहुत सारे किनारे मामलों का प्रबंधन कर रहे हैं, तो उपलब्ध मॉड्यूल का उपयोग करें।


3

यह समाधान पागल लगता है, लेकिन शहद के रूप में चिकनी काम करता है

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

फ़ाइल csvwriter द्वारा लिखी जा रही है इसलिए सीएसवी गुण बनाए हुए हैं अर्थात कॉमा अलग हो गए हैं। सीमांकक आइटमों को अगली पंक्ति में ले जाने में, प्रत्येक बार परिसीमन में मदद करता है।


1
इतनी छोटी और इतनी जल्दी
इयान समा

1
काम करता है, और यदि आपके पास एक नेस्टेड सूची है, तो @ vy32 के उदाहरण का विस्तार करते हुए, आपके पास है:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
लॉरेंज

क्या यह वास्तव में पागल लगता है? मुझे लगता है कि यह पूरी तरह से ठीक लगता है
स्टेफ़नी ओवेन

3

एक csv फ़ाइल बनाने और लिखने के लिए

नीचे दिए गए उदाहरण एक सीएसवी फ़ाइल बनाने और लिखने का प्रदर्शन करते हैं। डायनामिक फाइल राइटर बनाने के लिए हमें एक पैकेज इम्पोर्ट सीएसवी इम्पोर्ट करने की जरूरत है, फिर फाइल रेफरेंस के साथ फाइल का एक उदाहरण बनाने की जरूरत है Ex: - ओपन ("D: \ sample.csv", "w", newline = "" ) file_writer के रूप में

यहाँ यदि फ़ाइल उल्लिखित फ़ाइल निर्देशिका के साथ मौजूद नहीं है, तो अजगर निर्दिष्ट निर्देशिका में एक ही फ़ाइल बनाएगा, और "w" लिखने का प्रतिनिधित्व करता है, यदि आप एक फ़ाइल पढ़ना चाहते हैं, तो "w" को "r" से या परिशिष्ट में बदलें। मौजूदा फाइल के लिए "a"। newline = "" निर्दिष्ट करता है कि यह हर बार जब आप पंक्ति बनाते हैं तो अतिरिक्त खाली पंक्ति को हटा देते हैं ताकि हम खाली पंक्ति का उपयोग कर सकें "=" ", फ़ील्ड की तरह सूची का उपयोग करके कुछ फ़ील्ड नाम (कॉलम नाम) बनाएं = [" नाम "," आयु " "," वर्ग "] , फिर लेखक के उदाहरण पर लागू होते हैं जैसे लेखक = csv.DictWriter (file_writer, fieldnames = फ़ील्ड) यहां शब्दकोश लेखक का उपयोग करते हुए और स्तंभ नामों को निर्दिष्ट करते हुए, स्तंभ नाम लिखने के लिए हम लेखक का उपयोग करते हैं। , जबकि फाइल वैल्यू लिखने के लिए डिक्शनरी मेथड का उपयोग करके पास होना चाहिए, यहां कुंजी कॉलम का नाम है और वैल्यू आपका संबंधित महत्वपूर्ण मूल्य है

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

2

ज्यूपिटर नोटबुक

कहते हैं कि आपकी सूची है A

फिर आप निम्नलिखित विज्ञापन को कोड कर सकते हैं यह आपके पास सीएसवी फ़ाइल (केवल कॉलम!) के रूप में होगा।

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

1

आपको निश्चित रूप से CSV मॉड्यूल का उपयोग करना चाहिए, लेकिन संभावना है, आपको यूनिकोड लिखना होगा। जिन लोगों को यूनिकोड लिखना है, उनके लिए यह उदाहरण पृष्ठ से कक्षा है, जिसे आप उपयोग मॉड्यूल के रूप में उपयोग कर सकते हैं:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

1

यहां एक और समाधान है जिसे csvमॉड्यूल की आवश्यकता नहीं है ।

print ', '.join(['"'+i+'"' for i in myList])

उदाहरण :

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

हालांकि, यदि प्रारंभिक सूची में कुछ "शामिल हैं, तो वे बच नहीं जाएंगे। यदि यह आवश्यक है, तो इस तरह से बचने के लिए फ़ंक्शन को कॉल करना संभव है:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.