跳转到主要内容

将CSV转换为具有预定义模式的字典。

项目描述

文档

这是什么?

此包定义了基本类 BaseCSVReaderBaseMultilineCSVReader。这些类可以用来遍历CSV文件并返回其内容作为字典。通常您应该使用 BaseCSVReader。当您遇到具有列中换行符的CSV文件的问题时,可以使用 BaseMultilineCSVReader,这可能会使标准读取器出错。

示例用法

您应该编写一个从这些基本类之一继承的自定义类。 example.py 文件有一个示例。基本上它将是这样的

from collective.csv2dict import BaseCSVReader, to_int, to_string

class ExampleCSVReader(BaseCSVReader):
    """Example csv reader class.

    We read three columns and skip one.
    """
    skip = [2]  # skip column index 2
    fields = [
        # The format is: (field name, filter method)
        ('id', to_int),
        ('fullname', to_string),
        ('email', to_string),
    ]

然后您可以使用此类来读取CSV文件。 example.py 文件再次提供了读取CSV文件和一些命令行选项的示例代码。简而言之,它归结为以下内容

c = reader(open(filename, 'U'))
# Iterate over the entries and print them.
for entry in c:
    print entry
print '%d entries ignored due to errors.' % c.ignored
print '%d entries read without errors.' % c.success

它将把这个CSV(位于 example.csv 中)

1,Maurits van Rees,ignored,maurits@example.org
2,Arthur Dent,ignored again,dentarthurdent@example.org

转换成这个字典

{'email': u'maurits@example.org',
 'fullname': u'Maurits van Rees',
 'id': 1}
{'email': u'dentarthurdent@example.org',
 'fullname': u'Arthur Dent',
 'id': 2}

注释

  • 建议始终以通用换行模式打开文件。这通常是避免单行中换行符的一些潜在问题的最佳方式。

  • 基本读取器会以简单的方式尝试猜测文件的编码,并在找不到良好编码时避免破坏。

  • 读者可能会忽略csv文件的第一行,因为它可能是标题行。我们对此进行简单检查:如果第一行的任何列都不能转换为整数,则它不是标题行,将被视为数据。如果这个逻辑对您不起作用,那么只需像这样覆盖您自己类中的is_header方法

    def is_header(self, items):
        return False

    这将确保第一行始终被视为数据。如果您希望它始终被视为标题,只需执行return True

  • 如果需要在读取器开始处理之前对某些行或整个csv文件进行一些修复,可以覆盖prepare_iterable方法。BaseMultilineCSVReader为此提供了一个示例。

  • 默认情况下使用Excel csv方言(或Python版本中作为默认值的任何方言)。如果您想使用特定的方言,可以覆盖读取器类中的dialect变量。例如,您可以使用制表符作为分隔符,如下所示

    import csv
    
    class MyDialect(csv.excel):
        delimiter = '\t'
    
    csv.register_dialect('mydialect', MyDialect)
    
    class ExampleCSVReader(BaseCSVReader):
        dialect = 'mydialect'
        fields = [...]

兼容性

我曾在Python 2.6及其之前版本2.4上尝试过。它可能在2.3及以后的2.x版本上都能工作。

在Mac OS X上进行了测试,因此可能在任何类Unix系统上也能工作。尽管如此,我想象到在一些角落案例中可能存在关于换行符的问题。

Plone用户注意

我通常为Plone制作软件包,但这个软件包可以用纯Python使用。尽管如此,对于Plone用户来说,一个注意事项可能是个好主意。

如果您想在Plone构建中用它,只需将其添加到buildout.cfg中的eggs即可。您不需要加载zcml或安装任何东西。您只需要像上面示例中那样编写自己的类定义。然后您可能想编写一个浏览器视图,使用这个类将某些上传的csv文件转换为字典。然后您可能为这个字典中的每个条目创建一个内容项或成员,或者对其进行任何您想要的操作。

作者

  • 毛里茨·范·里斯(软件包创建、各种改进和通用化)

  • 吉多·韦斯多普(初始代码,为2007年的客户编写)

变更日志

1.1 (2014-04-11)

  • 可选地允许忽略额外的列。要使用此功能:用ignore_extra_columns=True初始化读取器。[毛里茨]

  • 为读取器添加formatting方法。它当前返回分隔符、方言实例、编码和预期的列数。您可以使用此功能在上传表单中提供提示。[毛里茨]

1.0 (2012-06-21)

  • 初始发布[毛里茨]

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面