我正在将一个简单的CSV文件导入我的GAE应用程序,并希望选择列表的第一项。下面的代码导入CSV文件并将每行保存为列表。现在我希望它只显示每个列表项的第一个条目,但是如果我使用数据[1]则表示它超出了范围。我想我错过了一些显而易见的东西,但似乎无法弄明白。非常感谢任何帮助!
class CSVImport(webapp2.RequestHandler):
def post(self):
csv_file = self.request.get('csv_import')
fileReader = csv.reader(csv_file.split("\n"))
dataset = []
dataset.extend(fileReader)
for data in dataset:
self.response.out.write(data)
编辑1
有关信息,初始代码给出了以下回复:[' name',' description',' url',' category' ,' deliverycost',' return','提供商',' prov_id',' logo',' last_update'] ['亚马逊','更改了desc',' http://www.url.com',' Meta' ;,' 5欧元'' Gratis',' Affilinet''测试',' / images / logos / amazon。 jpg',' 2012-12-26 13:11:22.519000'] [' B Shop','',' http: //www.url.com' ;,'','','','',&#39 ;','',' 2012-12-26 13:19:01.545000'] [' Otto','测试某事& #39;,' http://amazon.de',' Meta','',' sdgs',' sdgsdg',' sdgds',' dsgdsg',' 2012-12-26 13:09:10.716000'] []
根据RocketDonkey的回答,我将代码重写为以下内容:
class CSVImport(webapp2.RequestHandler):
def post(self):
csv_file = self.request.get('csv_import')
with open(csv_file, 'rb') as f:
fileReader = csv.reader(f)
for data in fileReader:
print data[0]
然而,这会出现以下错误:IOError:[Errno 13]文件无法访问:'名称,描述,网址,类别,deliverycost,returns,provider,prov_id,logo,last_update \ r \ nAmazon,已更改desc,http://www.url.com,Meta,5 Euro,Gratis,Affilinet,Test,/ images / logos / amazon.jpg,2012-12-26 13:11:22.519000 \ r \ nB Shop ,, http ://www.url.com,,,,,,,,,,,,,,,,,,,,,,,,, test test test test test test test test test test test dsgdsg,2012-12-26 13:09:10.716000 \ r \ n'
' 可访问后的内容:'是CSV文件的确切内容,这就是为什么我发现错误'文件无法访问'显着。 CSV文件通过HTML表单传入,如下所示:
<form action="/admin/shop/import" method="post" enctype="multipart/form-data">
<p><strong>Import:</strong>
<input type="file" name="csv_import" id="csv_import" accept=".csv">
<input type="submit" value="Import"></p>
</form>
我知道RemoteAPI可能是一个更好的解决方案,但是我在Windows 7下设置这个问题很麻烦,这就是为什么我现在试图将其作为一种解决方法。因此,一旦我能够从CSV文件的单个列中选择数据,我将把它与我定义的数据库模型匹配。
答案 0 :(得分:0)
在python中,数组从0 ... n-1开始,所以当你尝试只显示每个列表项的第一个条目时,绝对应该使用数组[0],它不应该是数据[1]无论如何。
答案 1 :(得分:0)
修改:根据您更新的回复,您似乎在csv_file
获取实际文件内容,并且换行符分隔符为\r\n
。因此,我建议尝试以下方法:
In [1]: import csv
In [2]: csv_file = # Copied the response from your error into this variable
In [3]: reader = csv.reader(csv_file.split('\r\n'))
In [4]: for row in reader:
...: if row:
...: print row[0]
...:
...:
name
Amazon
B Shop
Otto
if row
检查已完成,因为您可以看到CSV字符串的结尾是\r\n
,这意味着当您在\r\n
字符上拆分时,最后一项是列表将为空。当csv.reader
读取该空元素时,结果是一个空列表,如果您尝试按索引进行任何类型的访问,如您所知,该列表将失败并显示IndexError
。或者,您可以事先执行此操作以确保所有“行”包含值:
In [8]: csv_file = [row for row in csv_file.split('\r\n') if row]
In [9]: reader = csv.reader(csv_file)
In [10]: for row in reader:
....: print row[0]
....:
....:
name
Amazon
B Shop
Otto
我不确定您的用例,但如果您使用代码将数据上传到您的应用,我建议您查看Remote API - 这提供了一个非常简洁的方法这样做,并使您不必使用特殊处理程序等。
我会假设您传入的是实际的CSV(不是文件的字符串名称 - 如果您传递的是文件名,请参见下文),如下所示:
some_csv = 'header1,header2\nvalue1,value2'
您正在做的是拆分换行符并传递csv.reader
要迭代的对象,其结果是csv.reader
个对象。请注意,您可以直接在此对象上进行迭代,因此您无需创建单独的dataset
变量:
In [1]: import csv
In [2]: some_csv = 'header1,header2\nvalue1,value2'
In [3]: fileReader = csv.reader(some_csv.split("\n"))
In [4]: fileReader
Out[4]: <_csv.reader object at 0x1306440>
In [5]: for data in fileReader:
...: print data
...:
...:
['header1', 'header2']
['value1', 'value2']
使用print data[1]
将打印每个列表的第二项(如@ sadaf2605所述,Python使用从零开始的索引,因此第一个元素实际上是data[0]
)。您的错误表明每行只有一个元素,因此首先要检查的是您是否实际上将逗号分隔值传递给该参数。
但是,您还提到要导入CSV 文件 - 您的URL参数是文件名本身的字符串引用吗?如果是这样,那将导致问题,因为您实际上不会打开文件 - 您将遍历仅包含文件本身名称的对象,而不是数据:
In [1]: import csv
In [2]: some_csv = 'some_csv.csv'
In [3]: fileReader = csv.reader(some_csv.split("\n"))
In [4]: for data in fileReader:
...: print data
...:
...:
['some_csv.csv']
再次在基于零的索引上,您可以看到此数组没有第二个元素,因此您将获得IndexError
。如果是这种情况,你可以尝试这个(虽然我会再次建议远程API :))
In [1]: import csv
In [2]: some_csv = 'some_csv.csv'
In [3]: with open(some_csv, 'rb') as f:
...: fileReader = csv.reader(f)
...: for data in fileReader:
...: print data[0]
...:
...:
header1
value1