मैं सीएसवी प्रारूप में डेटा को स्ट्रिंग के रूप में कैसे लिखूं (फाइल नहीं)?


119

मैं [1,2,'a','He said "what do you mean?"']CSV-स्वरूपित स्ट्रिंग की तरह डेटा डालना चाहता हूं ।

आम तौर पर कोई भी इसके लिए उपयोग करेगा csv.writer(), क्योंकि यह सभी पागल किनारे के मामलों (अल्पविराम से बचना, उद्धरण चिह्न से बचना, सीएसवी बोली, आदि) को संभालता है। पकड़ यह है कि csv.writer()एक फ़ाइल ऑब्जेक्ट के आउटपुट की उम्मीद है, न कि एक स्ट्रिंग के लिए।

मेरा वर्तमान समाधान यह कुछ हद तक हैक करने योग्य कार्य है:

def CSV_String_Writeline(data):
    class Dummy_Writer:
        def write(self,instring):
            self.outstring = instring.strip("\r\n")
    dw = Dummy_Writer()
    csv_w = csv.writer( dw )
    csv_w.writerow(data)
    return dw.outstring

क्या कोई और अधिक सुरुचिपूर्ण समाधान दे सकता है जो अभी भी किनारे के मामलों को अच्छी तरह से संभालता है?

संपादित करें: यहां बताया गया है कि मैंने इसे कैसे किया:

def csv2string(data):
    si = StringIO.StringIO()
    cw = csv.writer(si)
    cw.writerow(data)
    return si.getvalue().strip('\r\n')

2
पाइथन 3 StringIO()में, ioलाइब्रेरी में है।
अरिस्टाइड

जवाबों:


66

आप StringIOअपने खुद के बजाय उपयोग कर सकते हैं Dummy_Writer:

यह मॉड्यूल एक फ़ाइल जैसी कक्षा को लागू करता है StringIO, जो एक स्ट्रिंग बफर (जिसे मेमोरी फ़ाइलों के रूप में भी जाना जाता है) पढ़ता है और लिखता है।

वहाँ भी है cStringIO, जो StringIOवर्ग का एक तेज़ संस्करण है ।


164

पायथन 3 में:

>>> import io
>>> import csv
>>> output = io.StringIO()
>>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!\nNewlines!"]
>>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
>>> writer.writerow(csvdata)
59
>>> output.getvalue()
'1,2,"a","He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'

पायथन 2 के लिए कुछ विवरणों को थोड़ा बदलना होगा:

>>> output = io.BytesIO()
>>> writer = csv.writer(output)
>>> writer.writerow(csvdata)
57L
>>> output.getvalue()
'1,2,a,"He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'

अच्छा उदाहरण। :) एक सिडेनोट के रूप में, एक CSV फ़ाइल के अंदर newlines से मुठभेड़ करते समय सामान्य व्यवहार क्या है? क्या \nडेटा के बीच में होना ठीक है, लेकिन \r\nयह किसी भी मामले में रिकॉर्ड के अंत को इंगित करता है जहां यह दिखाई देता है? (मान लें कि आप एक प्लेटफ़ॉर्म पर हैं \r\nजो लाइन टर्मिनेटर के रूप में उपयोग होता है।)
ली-आंग यिप

2
होना चाहिए output = StringIO.StringIO(), io.StringIO()टाइप-इयरर को बढ़ाएगा: स्ट्रिंग तर्क अपेक्षित है, 'स्ट्रैट' मिला।
मर्बोनी

2
@ कार्बोनि: स्ट्रिंग 3 पायथन 3 में चला गया है (जो कि मेरे समाधान में लिखा गया है), और मैं पायथॉन 2.7.3 में उस त्रुटि को पुन: उत्पन्न नहीं कर सकता - हालांकि मुझे writer.writerow(...)लाइन में टाइपर्रर मिलता है ( unicode argument expected, got 'str')। इस पर गौर करेंगे।
टिम पीटरज़ॉक्ट

1
@ कार्बोनी: हेड-अप के लिए धन्यवाद: मुझे स्टैकऑवरफ्लो की मदद से समस्या का पता चला । अजगर 2 में, आपको io.BytesIO()इसके बजाय की आवश्यकता है io.StringIO()
टिम पीटरज़ॉक्ट

1
@ कार्बनी: पायथन 2.7.9 में यह स्ट्रिंगरियो.सिंगरियो () या io.BytesIO () के साथ काम करता है।
बोले

6

मुझे जवाब मिला, सब सब में, थोड़ा भ्रमित। पायथन 2 के लिए, इस उपयोग ने मेरे लिए काम किया:

import csv, io

def csv2string(data):
    si = io.BytesIO()
    cw = csv.writer(si)
    cw.writerow(data)
    return si.getvalue().strip('\r\n')

data=[1,2,'a','He said "what do you mean?"']
print csv2string(data)

2

चूँकि मैं इसे काफी हद तक परिणाम के रूप में उपयोग कर रहा हूँ अतुल्यकालिक रूप से उपयोगकर्ता के लिए वापस csv डेटा के रूप में मैं पायथन 3 के लिए निम्नलिखित स्निपेट लिखा था ।

स्निपेट आपको एक ही स्ट्रिंगरियो बफर को बार-बार पुन: उपयोग करने देता है।


import csv
from io import StringIO


class ArgsToCsv:
    def __init__(self, seperator=","):
        self.seperator = seperator
        self.buffer = StringIO()
        self.writer = csv.writer(self.buffer)

    def stringify(self, *args):
        self.writer.writerow(args)
        value = self.buffer.getvalue().strip("\r\n")
        self.buffer.seek(0)
        self.buffer.truncate(0)
        return value + "\n"

उदाहरण:

csv_formatter = ArgsToCsv()

output += csv_formatter.stringify(
    10,
    """
    lol i have some pretty
    "freaky"
    strings right here \' yo!
    """,
    [10, 20, 30],
)

जीथुब जिस्ट में आगे के उपयोग की जाँच करें: स्रोत और परीक्षण


0
import csv
from StringIO import StringIO
with open('file.csv') as file:
    file = file.read()

stream = StringIO(file)

csv_file = csv.DictReader(stream)

3
कोड-केवल उत्तर हतोत्साहित किए जाते हैं, आपको अपने जवाब में कुछ स्पष्टीकरण जोड़ना चाहिए
Raniz

-1

यहां वह संस्करण है जो utf-8 के लिए काम करता है। csvline2string केवल एक लाइन के लिए, अंत में लाइनब्रीक के बिना, कई लाइनों के लिए csv2string, लाइनब्रेक के साथ:

import csv, io

def csvline2string(one_line_of_data):
    si = BytesIO.StringIO()
    cw = csv.writer(si)
    cw.writerow(one_line_of_data)
    return si.getvalue().strip('\r\n')

def csv2string(data):
    si = BytesIO.StringIO()
    cw = csv.writer(si)
    for one_line_of_data in data:
        cw.writerow(one_line_of_data)
    return si.getvalue()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.