1

我正在将一个简单的 CSV 文件导入到我的 GAE 应用程序中,并且想要选择列表的第一项。下面的代码导入一个 CSV 文件并将每一行保存为一个列表。现在我希望它只显示每个列表项的第一个条目,但如果我使用 data[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', 'returning', 'provider', 'prov_id', 'logo', 'last_update ']['Amazon', 'Changed the desc', 'http://www.url.com', 'Meta', '5 Euro', 'Gratis', 'Affilinet', 'Test', '/images/ logos/amazon.jpg', '2012-12-26 13:11:22.519000']['B 店', '', 'http://www.url.com', '', '', '', '', '', '', '2012-12-26 13:19:01.545000']['Otto', 'Test something', '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] file not accessible: 'name,description,url,category,deliverycost,returning,provider,prov_id,logo,last_update\r\nAmazon,Changed the desc,http:// www.url.com,Meta,5 Euro,Gratis,Affilinet,Test,/im​​ages/logos/amazon.jpg,2012-12-26 13:11:22.519000\r\nB Shop,,http://www.url .com,,,,,,,2012-12-26 13:19:01.545000\r\nOtto,Test something,http://amazon.de,Meta,,sdgs,sdgsdg,sdgds,dsgdsg,2012-12- 26 13:09:10.716000\r\n'

' accessible: ' 之后的内容是 CSV 文件的确切内容,这就是为什么我发现错误 'file notaccessible' 非常显着的原因。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 文件的单个列中选择数据,我就会将其与我定义的数据库模型相匹配。

4

2 回答 2

0

在 python 中,数组从 0...n-1 开始,因此当您尝试仅显示每个列表项的第一个条目时,绝对应该使用数组 [0],无论如何它都不应该是数据 [1] .

于 2012-12-27T15:12:56.337 回答
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

检查完成是因为您可以看到 CSV 字符串的if row结尾是\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

我不确定您的用例,但如果您正在使用代码将数据上传到您的应用程序,我建议您查看远程 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']

Usingprint 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
于 2012-12-27T15:47:52.370 回答