【问题标题】:Python csv.reader: is cell string or number?Python csv.reader:是单元格字符串还是数字?
【发布时间】:2018-10-14 14:37:59
【问题描述】:

我有一个 Python csv.reader() 问题: 我有一个文本文件,其中包含基本上可以被 csv.reader 读取的数据,但我需要一个额外的功能,恐怕还没有包括在内: 我需要它返回一对 (a,b) 而不是返回单元格的值,其中 a 是单元格内容,b 是 True 或 False,具体取决于读者是否确实从单元格中删除了引号。

示例:我的文件包含一行(此处不可见:单元格是制表符分隔的):

"123" 123 """123"""

它应该返回它[(123,True), (123, False), ("123",True)]

我不能使用 quoting = csv.QUOTE_NONE,因为单元格中有引号和换行符。

关于我如何“超载”阅读器功能的任何想法?或者还有什么我可以用的吗?

【问题讨论】:

  • 不幸的是,csv 模块(至少在标准 Python 中)不是纯 Python 模块,而是调用 C 代码。您将不得不自己动手,但由于 csv 有很多极端情况,我的建议是获取源 Python 发行版并阅读它是如何实现的。然后,您可以在 C + Python 或纯 Python 中基于标准 csv 制作特定模块。或者,如果您只需要完整 CSV 规范的一个子集,自定义专用模块/功能可能是可行的方法
  • @Serge Ballesta 感谢您的解释!
  • 如果您在edit 问题中包含您目前拥有的代码,将会有所帮助。你能给一个示例 CSV 文件的链接吗? (例如使用 pastebin)

标签: python csv


【解决方案1】:

假设input.csv 包含(包含标签):

"123"   123 """123"""

您可以在不使用 CSV 库的情况下对其进行解析,如下所示:

def remove_quotes(cell):
    no_quotes = cell.strip('"')
    length_diff = len(cell) - len(no_quotes)

    if length_diff == 0:
        try:
            return (int(cell), False)
        except ValueError:
            return (cell, False)
    elif length_diff == 2:
        try:
            return (int(no_quotes), True)
        except ValueError:
            return (cell, True)
    else:
        return (no_quotes, True)

使用 open('input.csv') 作为 f_input: 对于 f_input 中的行: line = [remove_quotes(cell) for cell in line.strip().split('\t')] 打印(行)

这将打印:

[(123, True), (123, False), ('123', True)]            

remove_quotes() 函数删除所有引号并检测任何长度变化并相应地创建所需的元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多