我有一个双列csv,我通过HTML页面上传,以便通过python cgi脚本进行操作。查看服务器端的文件,它看起来是一个长字符串,即带有内容的名为test.csv的文件。
col1, col2
x,y
已成为
('upfile', 'test.csv', 'col1,col2'\t\r\nx,y')
Col1包含我想要操作的数据(即x),col 2包含其标识符(y)。是否有更好的上传方式或我需要手动提取我想要的字段 - 这似乎可能非常容易出错 感谢
答案 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
行现在是所有行的元组列表。