将上传的csv转换为python列表

时间:2011-03-04 23:30:16

标签: python list cgi

我有一个双列csv,我通过HTML页面上传,以便通过python cgi脚本进行操作。查看服务器端的文件,它看起来是一个长字符串,即带有内容的名为test.csv的文件。

col1,  col2  
x,y  

已成为

('upfile', 'test.csv', 'col1,col2'\t\r\nx,y') 

Col1包含我想要操作的数据(即x),col 2包含其标识符(y)。是否有更好的上传方式或我需要手动提取我想要的字段 - 这似乎可能非常容易出错 感谢

4 个答案:

答案 0 :(得分:4)

如果您在python中使用cgi模块,您应该可以执行以下操作:

form = cgi.FieldStorage()
thefile = form['upfile']

reader = csv.reader(thefile.file)
header = reader.next() # list of column names
for row in reader:
    # row is a list of fields
    process_row(row)

例如,请参阅cgi programming或python cgi module文档。

答案 1 :(得分:3)

你不能使用csv模块解析这个吗?它比滚动你自己更好。

的内容
import csv
import cgi

form = cgi.FieldStorage()
thefile = form['upfile']

reader = csv.reader(thefile, delimiter=',')
for row in reader:
  for field in row:
    doThing()

编辑:从下面发布的ars答案中纠正我的回答。

答案 2 :(得分:2)

看起来您的文件正在被HTML上传修改。有没有什么能阻止你进入ftp'in并将csv文件放到你需要的地方?

一旦CSV文件更合适,这里有一个快速功能,将其放入2D数组:

def genTableFrCsv(incsv):
    table = []
    fin = open(incsv, 'rb')
    reader = csv.reader(fin)
    for row in reader: 
        table.append(row)
    fin.close()
    return table

然后,您可以在内存中对整个列表进行操作,而不是像在Vitor的解决方案中那样从文件中逐位拉出。

答案 3 :(得分:-2)

简单的解决方案是rows = [row.split('\t') for r in csv_string.split('\r\n')]。如果您有来自不同平台的用户提交数据,则只会出现错误。他们可能会提交逗号或标签,其换行符可能是\ n,\ r \ n,\ r \ n或^ M.最简单的解决方案是使用正则表达式。如果您不知道正则表达式,请为此页面添加标记:

http://regexlib.com/CheatSheet.aspx

这是解决方案:

import re

csv_string = 'col1,col2'\t\r\nx,y' #obviously your csv opening code goes here

rows = re.findall(r'(.*?)[\t,](.*?)',csv_string)
rows = rows[1:] # remove header

行现在是所有行的元组列表。