Chcę przesyłać dane takie jak [1,2,'a','He said "what do you mean?"']
do ciągu w formacie CSV.Jak zapisać dane w formacie csv jako ciąg (nie plik)?
Normalnie można by użyć csv.writer()
dla tego, ponieważ obsługuje wszystkie szalone przypadków brzegowych (przecinek ucieczce cudzysłów ucieczce dialektów CSV, itp) Połów jest, że csv.writer()
oczekuje na wyjście z obiektu pliku, a nie do strunowy.
Moje obecne rozwiązanie jest to nieco hacky 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 obsługuje przypadki brzegowe dobrze?
Edycja: Oto jak skończyło się to robi:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
Dobry przykład. :) Jak zwykle, jakie jest zwyczajowe zachowanie podczas napotykania znaków nowej linii w pliku CSV? Czy "\ n" jest w porządku w środku danych, ale '\ r \ n' wskazuje koniec rekordu bez względu na to, gdzie się pojawi? (Zakładając, że jesteś na platformie, która używa '\ r \ n' jako terminatora linii.) –
Nie jestem pewien. Sam bym się spodziewał '\ r \ n', ponieważ domyślnym parametrem dla' io.StringIO() 'jest' newline = None', który włącza tryb uniwersalnych znaków nowej linii, który powinien automatycznie używać poprawnego stylu linii nowej linii w zależności od platformy. Sam jestem trochę zaskoczony tym zachowaniem. –
@ Li-aungYip: Otworzyłem [pytanie na ten temat] (http://stackoverflow.com/questions/9157623/unexpected-behavior-of-universal-newline-mode-with-stringio-and-csv-modules). –