Python 使用app engine正确解析FTP服务器中的CSV文件

Python 使用app engine正确解析FTP服务器中的CSV文件,python,google-app-engine,csv,ftp,ftplib,Python,Google App Engine,Csv,Ftp,Ftplib,我正在尝试从FTP服务器读取CSV文件,并在app engine上解析它。 我可以访问文件并将其读取到StringIO,但当我尝试在文件行上循环时,它只是在每个字符上循环,而不是在行上循环。不确定我做错了什么: ftp = FTP('ftp.mydomain.com', 'username', 'pwd') ftp.set_pasv(True) r = StringIO() ftp.retrbinary('RETR test.csv', r.write) csvfile = csv.reade

我正在尝试从FTP服务器读取CSV文件,并在app engine上解析它。 我可以访问文件并将其读取到
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版本(
来自StringIO导入StringIO
),您可以简单地返回到开始并直接传递:


对于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
不接受二进制,所以您需要
retrline

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