将csv转换为具有预定义架构的字典。

collective.csv2dict的Python项目详细描述


Documentation

What is this?

这个包定义基类BaseCSVReaderBaseMultilineCSVReader。这些可用于在csv上迭代 归档并将其内容作为字典返回。通常你应该使用 BaseCSVReader。可以使用BaseMultilineCSVReader。 当您遇到csv文件的问题时 列中的字符,这可能会使标准读取器出错。

Example usage

您应该编写一个自己的类,该类继承自一个基类 上课。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}

Notes

  • 建议始终以通用换行模式打开文件。 这通常是避免 单行内的换行符。

  • 基本读取器尝试猜测 简单化的方式,当没有好的编码 找到了。

  • 读卡器可能会忽略csv文件的第一行,因为它可能是 头球。我们对此做一个简单的检查:如果 第一行可以变成整数,那么它不是头 行,它将被视为数据。如果这个逻辑不起作用 对于您,然后重写您自己类中的is_header方法, 就像这样:

    def is_header(self, items):
        return False
    

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

  • 如果需要,可以重写prepare_iterable方法 在 读者开始处理它。BaseMultilineCSVReader有一个 这方面的例子。

  • 默认情况下,使用excel csv方言(或任何python语言 版本为默认值)。如果你想用一种特定的方言,你 可以重写reader类中的dialect变量。为了 例如,可以使用制表符作为分隔符,如下所示:

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

Compatibility

我已经在Python2.6和2.4的早期版本上尝试过。它 可能在2.3以后的所有2.x版本上都可以工作。

在mac os x上测试过,很可能也在任何类unix系统上工作。 也应该在windows上工作,不过我可以想象newline的问题 一些角落里的人物。

Note for Plone users

我通常做包装用在plone上,但这个可以用 用普通的Python。不过,plone用户的注意事项可能是 很好。

如果你想在你的plone构建中使用它,只需将它添加到 你的buildout.cfg里有鸡蛋。您不需要加载zcml或安装 什么都行。您只需编写自己的类定义,如 上面的例子。然后你可能想写一个浏览器视图 使用此类将一些上载的csv文件转换为字典。那么 您可能会为此中的每个项创建一个内容项或一个成员 或者你想用它做什么就用它。

Authors

  • Maurits van Rees(包创建、各种改进和 概括)
  • Guido Wesdorp(初始代码,2007年为客户端编写)

Changelog

1.1 (2014-04-11)

  • 允许忽略额外的列。使用这个:初始化 带ignore_extra_columns=True的读取器。 [毛里塔尼亚]
  • 向读取器添加formatting方法。它当前返回分隔符、方言实例、编码和预期的 列数。你可以用这个在上传中给出提示 形式。 [毛里塔尼亚]

1.0 (2012-06-21)

  • 初次发行 [毛里塔尼亚]

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在windows上向doclet添加多个sourcepath?   java谷歌地图应用程序   java为以下场景创建正则表达式   Java文件通道异常   Java集合如何将文件对象列表转换为路径对象列表?   多线程生产者/消费者模型使用Java(同步),但始终运行同一线程   java如何为存储在ArrayList中的特定属性设置值?   java一次不能加载多个osm文件   使用java 8将map<String,map<Long,customeObject>>转换为list<customeObject>   java JDK包含哪些脚本语言解释器?   java为什么eclipse在这里生成语法错误?   多线程Javasocket异常:socket已关闭且值为空   java我想在Android活动中创建一个带有图像的可滚动文本列表。我应该用什么?   java实现编译时警告   java根据安卓 SQLite数据库中前一行的相同值递增特定值   java移动迭代器语句使代码可编译   java JVM终身/旧代已达到限制&服务器挂起   为什么我们不能在映射上使用迭代器(Java)?   xml如何映射JAXB中已有的JavaBean