GAE Выбор первого столбца импортированного CSV

Я импортирую простой 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 Shop', '', 'http://www.url.com', '', '', '', '', '', '', '2012-12-26 13:19:01.545000']['Отто', 'Испытай что-нибудь', '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] недоступен: 'имя, описание, URL, категория, стоимость доставки, возвращение, провайдер,prov_id, логотип,last_update\r\nAmazon, измененный дескриптор,http://www.url.com,Meta,5 евро, бесплатно,Affilinet,Test,/images/logos/amazon.jpg,2012-12-26 13:11:22.519000\r\nB Магазин,,http://www.url.com,,,,,,,2012-12-26 13:19:01.545000\r\n Отто, протестируйте что-нибудь,http://amazon.de,Meta,,sdgs,sdgsdg,sdgds,dsgdsg,2012-12-26 13:09:10.716000\r\n'

Содержимое после "available:" является точным содержимым CSV-файла, поэтому я нахожу ошибку "file not available" замечательной. Файл 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 ответа

Решение

Изменить: По вашему обновленному ответу, похоже, что вы получаете фактическое содержимое файла в 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, Если это ваш случай, вы можете попробовать это (хотя я бы снова предложил Remote 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

В python массив начинается с 0...n-1, поэтому, когда вы пытаетесь отобразить только первую запись каждого элемента списка, то, безусловно, вы должны использовать array[0], это никак не должно быть data[1],

Другие вопросы по тегам