我试图将一些虚拟内容从CSV文件批量加载到开发站点进行一些测试.我在Mac OS X 10.6.6上使用Plone 4.0.1和Python 2.6.5.
1)我以为我会创建一个快速脚本来迭代CSV文件,然后创建一些自定义内容类型:(类似于http://plone.org/documentation/kb/batch-adding-users).在Plone 3中,我能够解析这个版本中的CSV文件.
但是,我在split上遇到了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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
最好,帕特里克
你可以尝试这样的事情:
>>> 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']
...
Run Code Online (Sandbox Code Playgroud)
有关python和csv的更多信息,请访问:http://docs.python.org/library/csv.html
再见,贾科莫
这里的核心问题是依赖于File对象的内部.例如,File实现可以使用链接数据结构,其中顶级"File.data"对象本身具有指向"File.data.data"对象的链接,以分解数据库中的对象,从而允许读取文件的一部分没有从数据库中加载整个东西.在这种情况下,您只能直接获取访问该属性的部分文件数据.但这只是依靠内部时可能遇到的问题的一个例子.
而是使用File对象明确支持的接口访问文件内容.假设File对象是OFS.Image.File实例,我唯一看到它支持的是str().所以,如果您唯一的选择是使用ZODB中的OFS.Image.File实例,那么最好的选择是执行str(dummy).split('\n').
也就是说,对于大型文件来说,这可能会占用大量内存.从文件系统上的文件加载CSV会更好,Python CSV模块可以高效访问这些文件,而无需将其全部加载到内存中.
| 归档时间: |
|
| 查看次数: |
1813 次 |
| 最近记录: |