【问题标题】:Reading a csv file in Python with different line terminator使用不同的行终止符在 Python 中读取 csv 文件
【发布时间】:2009-11-20 14:51:41
【问题描述】:

我有一个 CSV 格式的文件,其中分隔符是 ASCII 单元分隔符 ^_,行终止符是 ASCII 记录分隔符 ^^(显然,因为这些是非打印字符,所以我只使用了其中一个在此处编写它们的标准方法)。我已经编写了很多读取和写入 CSV 文件的代码,所以我的问题不在于 Python 的 csv 模块本身。问题是 csv 模块不支持读取(但它确实支持写入)除回车或换行之外的行终止符,至少从我刚刚测试过的 Python 2.6 开始。文档说这是因为它是硬编码的,我认为这是在模块基础的 C 代码中完成的,因为我在 csv.py 文件中没有看到任何可以更改的内容。

有没有人知道解决这个限制的方法(补丁、另一个 CSV 模块等)?我真的需要读取一个不能使用回车符或换行符作为行终止符的文件,因为这些字符会出现在某些字段中,如果可能的话,我想避免编写自己的自定义阅读器代码,尽管这很容易满足我的需求。

【问题讨论】:

    标签: python csv delimiter


    【解决方案1】:

    为什么不为csv.reader 函数提供自定义迭代?这是一个简单的实现,它一次将 CSV 文件的全部内容读取到内存中(这可能是可取的,也可能不是可取的,具体取决于文件的大小):

    def records(path):
        with open(path) as f:
            contents = f.read()
            return (record for record in contents.split('^^'))
    
    csv.reader(records('input.csv'))
    

    我认为应该可以。

    【讨论】:

    • 是的,虽然这是我试图避免做的事情。
    • 这里的生成器表达式具有误导性;直接使用 split() 结果会发生相同的(ish)内存使用,而不是将其包装在没有任何好处的理解中。
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2022-07-27
    • 2018-11-02
    • 1970-01-01
    • 2017-12-07
    • 2022-01-16
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多