Я не могу придумать более четкого объяснения, чем то, что сказал инженер Google, которого вы упомянули.Итак, давайте разберемся с этим немного.
Модуль Python csv
работает с файловыми объектами, то есть файлом или чем-то, что ведет себя как файл Python.Следовательно, csv.reader () ожидает получить объект файла, поскольку это только обязательный параметр.
Объект запроса webapp.RequestHandler
обеспечивает доступ к параметрам HTTP, которые публикуются в форме.В HTTP параметры публикуются в виде пар ключ-значение, например, csv=record_one,record_two
.Когда вы вызываете self.request.get('csv')
, это возвращает значение , связанное с ключом csv в виде строки Python.Строка Python не является файловым объектом.Очевидно, модуль csv
отступает, когда он не понимает объект и просто выполняет его итерацию (в Python строки можно перебирать по символам, например, for c in '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)
, который будет работать, как вы ожидаете.* Edit Я предполагаю, что вы используете что-то вроде <textarea/>
для сбора файла CSV.Если вы загружаете вложение, может потребоваться другая обработка (я не очень знаком с Python GAE или с тем, как он обрабатывает вложения).