簡體   English   中英

從帶有應用程序引擎的FTP服務器正確解析CSV文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM