Python csv.reader:是单元格字符串还是数字?

时间:2018-05-04 07:17:19

标签: python csv

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

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

BlogPost.deep_pluck( :id, :image, :title, :content, blog_author: [:id, :name], blog_category: [:id, :name], )

它应该返回它"123" 123 """123"""

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

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

1 个答案:

答案 0 :(得分:0)

假设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 line.strip()。split('\ t')]         打印(行)

这将打印:

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

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