Saya ingin mentransmisikan data seperti [1,2,'a','He said "what do you mean?"']
string berformat CSV.
Biasanya seseorang akan menggunakan csv.writer()
untuk ini, karena menangani semua kasus tepi gila (pelolosan koma, pelolosan tanda kutip, dialek CSV, dll.) Tangkapannya adalah yang csv.writer()
mengharapkan keluaran ke objek file, bukan ke string.
Solusi saya saat ini adalah fungsi yang agak hack ini:
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
Adakah yang bisa memberikan solusi yang lebih elegan yang masih menangani casing tepi dengan baik?
Sunting: Begini akhirnya saya melakukannya:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
StringIO()
ada diio
perpustakaan.Jawaban:
Anda bisa menggunakan
StringIO
sebagai pengganti Anda sendiriDummy_Writer
:Ada juga
cStringIO
, yang merupakan versiStringIO
kelas yang lebih cepat .sumber
Dengan Python 3:
Beberapa detail perlu sedikit diubah untuk Python 2:
sumber
\n
ok untuk memiliki di tengah data, tetapi\r\n
menunjukkan akhir dari catatan di mana pun itu muncul? (Dengan asumsi Anda berada di platform yang digunakan\r\n
sebagai terminator jalur.)output = StringIO.StringIO()
,io.StringIO()
akan memunculkan TypeError: argumen string diharapkan, mendapat 'str'.writer.writerow(...)
baris (unicode argument expected, got 'str'
). Akan melihat ini.io.BytesIO()
bukanio.StringIO()
.Saya menemukan jawabannya, secara keseluruhan, agak membingungkan. Untuk Python 2, penggunaan ini berhasil untuk saya:
sumber
karena saya menggunakan ini cukup banyak untuk mengalirkan hasil secara asynchronous dari sanic kembali ke pengguna sebagai data csv saya menulis potongan berikut untuk Python 3 .
Cuplikan memungkinkan Anda menggunakan kembali buffer StringIo yang sama berulang kali.
contoh:
Lihat penggunaan lebih lanjut di github gist: source and test
sumber
sumber
Ini versi yang berfungsi untuk utf-8. csvline2string hanya untuk satu baris, tanpa linebreak di akhir, csv2string untuk banyak baris, dengan linebreak:
sumber