programing

데이터를 파일이 아닌 문자열로 CSV 형식으로 쓰는 방법은 무엇입니까?

lastcode 2023. 6. 26. 21:24
반응형

데이터를 파일이 아닌 문자열로 CSV 형식으로 쓰는 방법은 무엇입니까?

저는 다음과 같은 데이터를 캐스팅하고 싶습니다.[1,2,'a','He said "what do you mean?"']CSV 형식의 문자열로 변환합니다.

일반적으로 다음을 사용합니다.csv.writer()이를 위해 모든 미친 에지 사례(콤마 이스케이프, 따옴표 이스케이프, CSV 방언 등)를 처리하기 때문입니다.함정은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')

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'

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'

당신은 당신의 것 대신에 사용할 수 있습니다.Dummy_Writer:

이 모듈은 파일과 같은 클래스를 구현합니다.StringIO문자열 버퍼(메모리 파일이라고도 함)를 읽고 씁니다.

또한 가 있습니다. 이것은 더 빠른 버전입니다.StringIO학급.

저는 이것을 사용하여 sanic에서 csv 데이터로 사용자에게 비동기식으로 결과를 스트리밍하기 때문에 Python 3을 위해 다음 스니펫을 작성했습니다.

이 스니펫을 사용하면 동일한 StringIo 버퍼를 반복적으로 재사용할 수 있습니다.


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],
)

githubstic: 소스테스트에서 추가 사용 방법을 확인하십시오.

저는 답이 전반적으로 약간 혼란스럽다는 것을 알았습니다.Python 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)

다음은 utf-8. csvline2 문자열을 한 줄로 구분하지 않고 끝에 줄 바꿈 없이, csv2 문자열을 여러 줄로 구분하여 사용할 수 있는 버전입니다.

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()
import csv
from StringIO import StringIO
with open('file.csv') as file:
    file = file.read()

stream = StringIO(file)

csv_file = csv.DictReader(stream)

언급URL : https://stackoverflow.com/questions/9157314/how-do-i-write-data-into-csv-format-as-string-not-file

반응형