Загрузка и файл CSV синтаксического анализа с механизмом приложения Google

Я задаюсь вопросом, может ли кто-либо с лучшим пониманием Python и gae помочь мне с этим. Я загружаю файл CSV от формы до gae хранилища данных.

class CSVImport(webapp.RequestHandler):
  def post(self):
     csv_file = self.request.get('csv_import')
     fileReader = csv.reader(csv_file)
     for row in fileReader:       
       self.response.out.write(row) 

Я сталкиваюсь с той же проблемой, которую кто-то еще упоминает здесь - http://groups.google.com/group/google-appengine/browse_thread/thread/bb2d0b1a80ca7ac2/861c8241308b9717

Таким образом, csv.reader выполняет итерации по каждому символу а не строке. Инженер Google оставил это объяснение:

Вызов self.request.get ('csv') возвращает Строку. Когда Вы выполняете итерации по строке, Вы выполняете итерации по символам, не строкам. Вы видите различие здесь:

 class ProcessUpload(webapp.RequestHandler): 
   def post(self): 
     self.response.out.write(self.request.get('csv')) 
     file = open(os.path.join(os.path.dirname(__file__), 'sample.csv')) 
     self.response.out.write(file) 

     # Iterating over a file 
     fileReader = csv.reader(file) 
     for row in fileReader: 
       self.response.out.write(row) 

     # Iterating over a string 
     fileReader = csv.reader(self.request.get('csv')) 
     for row in fileReader: 
       self.response.out.write(row) 

Я действительно не следую за объяснением, и была неудачная реализация его. Кто-либо может дать более четкое объяснение этого и предложенной фиксации?

Спасибо, август

7
задан August Flanagan 3 June 2010 в 23:48
поделиться

2 ответа

Короткий ответ, попробуйте следующее:

fileReader = csv.reader(csv_file.split("\n"))

Длинный ответ, примите во внимание следующее:

for thing in stuff:
  print thing.strip().split(",")

Если материал является указателем на файл, каждый элемент представляет собой строку. Если материал представляет собой список, каждая вещь является элементом. Если материал - это строка, каждая вещь - это символ.

Итерация по объекту, возвращаемому csv.reader, даст вам поведение, подобное итерации по переданному объекту, только с каждым элементом, проанализированным CSV. Если вы перебираете строку, вы получите версию каждого символа, проанализированную в CSV.

13
ответ дан 6 December 2019 в 08:42
поделиться

Я не могу придумать более четкого объяснения, чем то, что сказал инженер Google, которого вы упомянули. Итак, давайте немного разберемся.

Модуль Python csv работает с файловыми объектами, то есть с файлом или чем-то, что ведет себя как файл Python. Следовательно, csv.reader () ожидает получить файловый объект, поскольку это единственный обязательный параметр.

Объект запроса webapp.RequestHandler обеспечивает доступ к параметрам HTTP, которые публикуются в форме. В HTTP параметры отправляются в виде пар "ключ-значение", например, csv = record_one, record_two . Когда вы вызываете self.request.get ('csv') , он возвращает значение , связанное с ключом csv, в виде строки Python. Строка Python не является файловым объектом. По-видимому, модуль csv откатывается, когда он не понимает объект и просто повторяет его (в Python строки могут повторяться по символам, например, для c в 'Test String' : print c напечатает каждый символ в строке в отдельной строке).

К счастью, Python предоставляет класс StringIO , который позволяет рассматривать строку как объект, подобный файлу. Итак (при условии, что GAE поддерживает StringIO, и нет никаких причин, по которым это не должно быть), вы должны иметь возможность сделать это:

class ProcessUpload(webapp.RequestHandler): 
   def post(self): 
     self.response.out.write(self.request.get('csv')) 

     # Iterating over a string as a file 
     stringReader = csv.reader(StringIO.StringIO(self.request.get('csv')))
     for row in stringReader: 
        self.response.out.write(row) 

Что будет работать так, как вы ожидаете.

Правка Я предполагаю, что вы используете что-то вроде