使用python读取csv文件时,区分“”和空值

问题描述 投票:0回答:2

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

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

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

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

我想要的行为是这样的:

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'

python csv double-quotes reader
2个回答
0
投票

通过csv module中的CPython source(搜索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)

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


0
投票

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

如果我更改输入文件使得引用的字符串具有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)

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

© www.soinside.com 2019 - 2024. All rights reserved.