Chcę rzutować dane jak [1,2,'a','He said "what do you mean?"']
ciąg w formacie CSV.
Zwykle by to używał csv.writer()
, ponieważ obsługuje wszystkie szalone przypadki skrajne (ucieczki przecinkami, znaki cudzysłowu, dialekty CSV itp.) csv.writer()
.
Moje obecne rozwiązanie to nieco zmyślona funkcja:
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
Czy ktoś może dać bardziej eleganckie rozwiązanie, które nadal dobrze radzi sobie z krawędziami?
Edycja: Oto jak to zrobiłem:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
StringIO()
znajduje się wio
bibliotece.Odpowiedzi:
Możesz użyć
StringIO
zamiast własnegoDummy_Writer
:Jest też
cStringIO
szybsza wersja tejStringIO
klasy.źródło
W Pythonie 3:
Niektóre szczegóły wymagają nieco zmiany w Pythonie 2:
źródło
\n
można mieć w środku danych, ale\r\n
wskazuje koniec rekordu bez względu na to, gdzie się pojawia? (Zakładając, że jesteś na platformie\r\n
output = StringIO.StringIO()
,io.StringIO()
spowoduje zgłoszenie błędu TypeError: oczekiwano argumentu string, otrzymano „str”.writer.writerow(...)
linii (unicode argument expected, got 'str'
). Przyjrzę się temu.io.BytesIO()
zamiastio.StringIO()
.W sumie odpowiedzi wydały mi się nieco zagmatwane. W przypadku Pythona 2 to użycie zadziałało:
źródło
ponieważ używam tego dość często do asynchronicznego przesyłania wyników z Sanic z powrotem do użytkownika w postaci danych csv, napisałem następujący fragment kodu dla Pythona 3 .
Fragment umożliwia wielokrotne używanie tego samego bufora StringIo.
przykład:
Sprawdź dalsze użycie na stronie github: źródło i test
źródło
źródło
Oto wersja, która działa dla utf-8. csvline2string dla jednej linii, bez podziałów linii na końcu, csv2string dla wielu linii, z podziałami linii:
źródło