Не могу разобрать CSV в Plone 4 - PullRequest
3 голосов
/ 31 июля 2011

Я пытаюсь выполнить групповую загрузку некоторого фиктивного контента из файла CSV на сайт разработки, чтобы провести некоторое тестирование. Я использую Plone 4.0.1, с Python 2.6.5, на Mac OS X 10.6.6.

1) Я подумал, что создам быстрый скрипт, который будет перебирать CSV-файл, а затем создавать некоторые из моих пользовательских типов контента: (По аналогии с http://plone.org/documentation/kb/batch-adding-users). В Plone 3 я мог анализировать файлы CSV в этой моде.

Однако я получил AttributeError при разделении. Я копирую из моего ipython (ipzope) тестирования:

>>> portal
<PloneSite at /Plone>
>>> portal['Scripts']['dummydata.csv']
<File at /Plone/Scripts/dummydata.csv>
>>> dummy = portal['Scripts']['dummydata.csv']
>>> dummy
<File at /Plone/Scripts/dummydata.csv>
>>> dummy.data.split('\n')
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
AttributeError: split

>>> dummy.split('\n')                                               
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
AttributeError: split

2) В конечном счете, я бы хотел использовать csv из стандартной библиотеки, которая также не работала.

>>> import csv
>>> csv
<module 'csv' from '/Applications/Plone/Python-2.6/lib/python2.6/csv.pyc'>
>>> spamReader = csv.reader(dummy, delimiter=',', quotechar='"')
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
TypeError: argument 1 must be an iterator

>>> spamReader = csv.reader(dummy.data, delimiter=',', quotechar='"') 
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
TypeError: argument 1 must be an iterator

Есть идеи?

Лучший, Patrick

Ответы [ 2 ]

6 голосов
/ 01 августа 2011

Вы можете попробовать что-то вроде этого:

>>> from StringIO import StringIO
>>> csv_io = StringIO(dummy.data)
>>> csv_reader = csv.reader(csv_io, delimiter=',', quotechar='"')
>>> for i in csv_reader: print i
['a','b','c']
['d','e','f']
...

Более подробную информацию о Python и CSV можно найти здесь: http://docs.python.org/library/csv.html

Пока, Джакомо

5 голосов
/ 01 августа 2011

Основная проблема здесь заключается в использовании внутренних элементов объекта File. Например, реализация File может использовать связанную структуру данных, в которой сам объект «File.data» верхнего уровня имеет ссылку на объект «File.data.data», чтобы разбить объекты в базе данных, позволяя прочитать часть файла. без загрузки всего этого из базы данных. В этом случае вы получите только часть данных файла, напрямую обращаясь к атрибуту. Но это всего лишь пример того типа ошибок, с которыми вы можете столкнуться, полагаясь на внутреннее устройство.

Вместо этого получите доступ к содержимому файла, используя интерфейс, явно поддерживаемый объектом File. Предполагая, что объект File является экземпляром OFS.Image.File, единственное, что я вижу в его поддержке - это str (). Поэтому, если вы предпочитаете использовать экземпляр OFS.Image.File в ZODB, лучше всего делать str (dummy) .split ('\ n').

Тем не менее, это, вероятно, будет очень много памяти для больших файлов. Вам было бы намного лучше загрузить CSV из файла в файловой системе, к которому модуль Python CSV будет иметь эффективный доступ без загрузки всего этого в память.

...