GAE选择导入的CSV的第一列

时间:2012-12-27 14:34:23

标签: python google-app-engine listproperty

我正在将一个简单的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文件的单个列中选择数据,我将把它与我定义的数据库模型匹配。

2 个答案:

答案 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