【问题标题】:Distinguish between "" and empty value when reading csv file using python使用python读取csv文件时区分“”和空值
【发布时间】:2019-09-09 23:29:43
【问题描述】:

CSV 文件包含诸如“”、“ab,abc”、“abc”之类的值。请注意,我指的是空值,如未知值。这与尚未设置值的“”不同。我以不同的方式对待这两个值。 我需要一种方法来读取 "" 和空值,并区分两者。我正在将数据映射到数字,使得“”映射到 0,并且映射到 NaN。 请注意,我没有解析问题,并且使用逗号作为分隔符可以很好地解析诸如“ab,abc”之类的字段。问题是python读取“”和空值,作为空字符串,例如''。并且这两个值不相同,不应该分组为空字符串。

不仅如此,我还需要编写csv文件,使“”写成“”而不是,,NaN应该写成,,(空值)。

我研究了 csv 方言,例如 doublequote、escapechar、quotechar、quoting。这不是我想要的。这些都是分隔符出现在数据中的所有情况,即“ab,abc”,正如我所提到的,使用特殊字符进行解析不是问题。

我不想使用 Pandas。我唯一能想到的是正则表达式?但如果我有数百万行要处理,那就是开销。

我想要的行为是这样的:

a = "\"\"" (or it could be a="" or a="ab,abc")
if (a=="\"\""):
    map[0]=0
elif(a==""):
    map[0]=np.nan
else:
    map[0] = a

我的csv阅读器如下:

import csv
f = open(filepath, 'r')
csvreader = csv.reader(f)
for row in csvreader:
        print(row)

我在读取 csv 文件时想要上述行为。目前只读取两个值:''(空字符串)或'ab,abc'。

我想要读取 3 个不同的值。 ' ' 空字符串、'""' 带双引号的字符串和实际字符串 'ab,abc'

【问题讨论】:

  • 你用什么来读取 csv?
  • @WoodyPride import csv f = open(filepath, 'r') csvreader = csv.reader(f)
  • @Naz 我建议编辑你的问题以包含它,它在评论中非常难以阅读......
  • CSV 文件的标准化程度并不高,但 RFC-4180 并未提及任何关于带引号和不带引号的空字段之间的区别;这只是想要做出的区别,还是您需要使用的文件已经存在的区别?
  • @chepner,没有文件有这样的数据。我的文件中引用的空字段和未引用的空字段之间存在区别。我只需要 python 将其映射到数字。此外,要编写 csv 文件,准确区分带引号和不带引号的空字段

标签: python csv double-quotes reader


【解决方案1】:

查看CPython source 中的csv module(搜索IN_QUOTED_FIELD),它没有任何内部状态可以让您执行此操作。比如解析:

"a"b"c"d

被解析为:'ab"c"d',这可能不是你所期望的。例如:

import csv
from io import StringIO

[row] = csv.reader(StringIO(
    '"a"b"c"d'))

print(row)

具体来说,引号仅在字段的开头进行特殊处理,所有字符都只是在遇到时添加到字段中,而不是在“取消引用”字段时允许触发任何特殊行为

【讨论】:

    【解决方案2】:

    我想到的解决方案是这样的:

    如果我更改输入文件以使引用的字符串具有 escapechar '\' , 以下是输入文件:

    col1,col2,col3
    "",a,b
    \cde \,f,g
    ,h,i
    \j,kl\,mno,p
    

    那么双引号的空域和不带引号的空域是可分离的

    csvreader = csv.reader(f, quotechar='\\')
        for row in csvreader:
            print(row)
    

    这是我目前为止最好的解决方案...

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 2019-03-09
      • 2018-07-17
      • 2023-03-17
      • 2015-06-14
      • 2011-08-12
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多