Я задаюсь вопросом, может ли кто-либо с лучшим пониманием 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)
Я действительно не следую за объяснением, и была неудачная реализация его. Кто-либо может дать более четкое объяснение этого и предложенной фиксации?
Спасибо, август
Короткий ответ, попробуйте следующее:
fileReader = csv.reader(csv_file.split("\n"))
Длинный ответ, примите во внимание следующее:
for thing in stuff:
print thing.strip().split(",")
Если материал является указателем на файл, каждый элемент представляет собой строку. Если материал представляет собой список, каждая вещь является элементом. Если материал - это строка, каждая вещь - это символ.
Итерация по объекту, возвращаемому csv.reader, даст вам поведение, подобное итерации по переданному объекту, только с каждым элементом, проанализированным CSV. Если вы перебираете строку, вы получите версию каждого символа, проанализированную в CSV.
Я не могу придумать более четкого объяснения, чем то, что сказал инженер 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)
Что будет работать так, как вы ожидаете.
Правка Я предполагаю, что вы используете что-то вроде
для сбора файла csv. Если вы загружаете вложение, может потребоваться другая обработка (я не совсем знаком с Python GAE или тем, как он обрабатывает вложения).