How do I write data into CSV format as string (not file)?

后端 未结 6 1328
借酒劲吻你
借酒劲吻你 2020-11-28 04:56

I want to cast data like [1,2,\'a\',\'He said \"what do you mean?\"\'] to a CSV-formatted string.

Normally one would use csv.writer() for

相关标签:
6条回答
  • 2020-11-28 05:26
    import csv
    from StringIO import StringIO
    with open('file.csv') as file:
        file = file.read()
    
    stream = StringIO(file)
    
    csv_file = csv.DictReader(stream)
    
    0 讨论(0)
  • 2020-11-28 05:29

    Here's the version that works for utf-8. csvline2string for just one line, without linebreaks at the end, csv2string for many lines, with linebreaks:

    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()
    
    0 讨论(0)
  • 2020-11-28 05:34

    You could use StringIO instead of your own Dummy_Writer:

    This module implements a file-like class, StringIO, that reads and writes a string buffer (also known as memory files).

    There is also cStringIO, which is a faster version of the StringIO class.

    0 讨论(0)
  • 2020-11-28 05:45

    In Python 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'
    

    Some details need to be changed a bit for Python 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'
    
    0 讨论(0)
  • 2020-11-28 05:51

    I found the answers, all in all, a bit confusing. For Python 2, this usage worked for me:

    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)
    
    0 讨论(0)
  • 2020-11-28 05:53

    since i use this quite a lot to stream results asynchronously from sanic back to the user as csv data i wrote the following snippet for Python 3.

    The snippet lets you reuse the same StringIo buffer over and over again.

    
    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"
    

    example:

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

    Check out further usage at the github gist: source and test

    0 讨论(0)
提交回复
热议问题