Pertanyaan benar parsing file CSV dari server FTP dengan mesin aplikasi


Saya mencoba membaca file CSV dari server FTP dan mem-parsingnya di mesin aplikasi. Saya dapat mengakses file dan membacanya StringIO tetapi ketika saya mencoba untuk melingkupi garis file, itu hanya loop di atas setiap karakter, bukan garis. Tidak yakin apa yang saya lakukan salah di sini:

ftp = FTP('ftp.mydomain.com', 'username', 'pwd')
ftp.set_pasv(True)
r = StringIO()
ftp.retrbinary('RETR test.csv', r.write)

csvfile = csv.reader(r.getvalue(), delimiter=',')

for line in csvfile: 
    print line

ini berakhir dengan sesuatu seperti ini:

['O']
['R']
['D']
['E']
['R']
['N']
['O']
['', '']
['O']
['R']
['D']
['E']
['R']
['D']
['A']
['T']
['E']
['', '']
['I']
['N']
['V']
['O']
['I']
['C']
['E']
['N']
['O']
['', '']
...

Apa cara yang benar untuk melakukan ini dan dengan benar mengurai file dari FTP jadi csv modul bisa membacanya dengan benar?


4
2018-06-18 17:47


asal


Jawaban:


Membagi string panjang pada baris baru; csv.reader() mengharapkan suatu iterable, di mana setiap iterasi satu baris dihasilkan. Anda memberikannya sebuah string, iterasi lebih dari karakter individu kemudian:

csvfile = csv.reader(r.getvalue().splitlines(), delimiter=',')

Anda tidak menunjukkan caranya StringIO() diimpor. Jika itu adalah versi python (from StringIO import StringIO) Anda dapat kembali ke awal dan meneruskannya langsung:

r.seek(0)
csvfile = csv.reader(r, delimiter=',')

3
2018-06-18 17:53



Untuk Python 3.x dan csv.DictReader:

bio = io.BytesIO()
resp = ftp.retrbinary("RETR " + filename, bio.write)
bio.seek(0)
csv_data = csv.DictReader(io.TextIOWrapper(bio, newline=None), delimiter=',')
for row in data:
    ...

Butuh beberapa saat untuk menemukan solusi ini jadi saya mempostingnya. Jawaban yang saya temukan tidak mengatasi masalah untuk mempertahankan data dengan cara yang akan dilakukan DictReader senang.

Jika kamu tidak peduli DictReader yang berikut mungkin berhasil:

sio = io.StringIO()
resp = ftp.retrlines("RETR " + filename, sio.write)
sio.seek(0)

Bukan berarti Anda membutuhkan retrlines karena Python3 StringIO tidak menerima biner.


2
2017-07-21 12:23