파일이 아닌 문자열로 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')
StringIO
자신의 대신 사용할 수 있습니다 Dummy_Writer
.
이 모듈
StringIO
은 문자열 버퍼 (메모리 파일이라고도 함)를 읽고 쓰는 파일 류 클래스를 구현합니다 .
cStringIO
더 빠른 StringIO
클래스 버전 인도 있습니다 .
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'
나는 대답을 모두 약간 혼란스럽게 찾았습니다. 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에서 작동하는 버전입니다. 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()
import csv
from StringIO import StringIO
with open('file.csv') as file:
file = file.read()
stream = StringIO(file)
csv_file = csv.DictReader(stream)
예제에는 데이터 행이 하나만 있으므로 간단히 사용할 수 있습니다.
input = [1,2,'a','He said "what do you mean?"']
output = ",".join(str(x) for x in input)
입력 데이터가 사전이나 2D 배열과 같이 더 복잡한 형태를 가지고 있다면이 간단한 대답은 더 복잡해질 것입니다.
참고 URL : https://stackoverflow.com/questions/9157314/how-do-i-write-data-into-csv-format-as-string-not-file
'program story' 카테고리의 다른 글
비동기 람다를 사용한 병렬 foreach (0) | 2020.08.30 |
---|---|
FileList에서 파일을 제거하는 방법 (0) | 2020.08.30 |
Java에서 두 숫자를 곱하면 오버플로가 발생하는지 어떻게 확인할 수 있습니까? (0) | 2020.08.30 |
DRY 방식으로 루비의 구조 절에 여러 오류 클래스 전달 (0) | 2020.08.30 |
엔티티 오류 매핑의 또 다른 반복 열 (0) | 2020.08.30 |