[英]correctly parsing a CSV file from an FTP server with app engine
我正在嘗試從FTP服務器讀取CSV文件,並在App Engine上解析它。 我可以訪問文件並將其讀取到StringIO
但是當我嘗試遍歷文件StringIO
,它僅遍歷每個字符而不是行。 不知道我在這里做錯了什么:
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
最終結果如下:
['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']
['', '']
...
正確執行此操作並從FTP正確解析文件以便csv
模塊可以正確讀取文件的正確方法是什么?
在換行符上分割長字符串; csv.reader()
需要一個iterable ,其中每次迭代都會產生一行。 您給它一個字符串,迭代遍歷各個字符,然后:
csvfile = csv.reader(r.getvalue().splitlines(), delimiter=',')
您沒有顯示StringIO()
導入方式。 如果它是python版本 ( from StringIO import StringIO
),您可以簡單地回到起點並將其直接傳遞給 :
r.seek(0)
csvfile = csv.reader(r, delimiter=',')
對於Python 3.x和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:
...
我花了一段時間才找到此解決方案,所以我將其發布。 我發現的答案不能解決使DictReader
滿意的方式來保存數據的問題。
如果您不關心DictReader
則可以執行以下操作:
sio = io.StringIO()
resp = ftp.retrlines("RETR " + filename, sio.write)
sio.seek(0)
並非因為Python3 StringIO
不接受二進制retrlines
所以不需要StringIO
代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.