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

f3temu5u  于 2023-02-28  发布在  Python
关注(0)|答案(3)|浏览(161)

CSV文件包含“"、“ab、abc”、“abc”等值。请注意,我指的是未知值中的空值。这与“"不同,”“中的值尚未设置。我对这两个值的处理方式不同。我需要一种方法来读取“”和空值,并区分两者。我将数据Map到数字,以便“”Map到0和,,Map到NaN。请注意,我没有遇到解析问题,使用逗号作为分隔符可以很好地解析“ab,abc”等字段。问题是python将“”和空值读取为' '等空字符串。这两个值不相同,不应分组为空字符串。
不仅如此,我还需要编写csv文件,使“”写为“”而不是,,NaN应该写为,,(空值)。
我已经研究了csv方言,如双引号,escapechar,quotechar,引用。这不是我想要的。这些都是分隔符出现在数据中的情况,即“ab,abc”,正如我所提到的,用特殊字符解析不是问题。
我不想使用Pandas。我唯一能想到的是regex?但是如果我有数百万行要处理,那是一个开销。
我想要的行为是这样的:

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“

p5cysglq

p5cysglq1#

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)

特别是,引号只在字段开头进行特殊处理,所有字符在遇到时都添加到字段中,而不允许在字段"取消引用"时触发任何特殊行为

fnvucqvd

fnvucqvd2#

我想出的解决办法是这样的:
如果我更改输入文件,使引用字符串有转义字符'',下面是输入文件:

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)

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

5t7ly7z5

5t7ly7z53#

如果你想在Python中阅读csv文件时能够区分空字符串和未定义的值,你可以通过以下方式来实现:

import csv
import uuid
import sys

csv_filepath = sys.argv[1]
delimiter = ','
quotechar = '"'
empty_string_placeholder = str(uuid.uuid4())

with open(csv_filepath) as f:
    # Convert empty strings to a placeholder value
    lines = (
        line.replace(f'{quotechar}{quotechar}', empty_string_placeholder)
        for line in f.readlines())
    reader = csv.reader(lines, delimiter=delimiter, quotechar=quotechar)
    for row in reader:
        for i, cell in enumerate(row):
            if cell == '':
                # If the cell is an empty string, it means that it was None originally
                row[i] = None
            elif cell == empty_string_placeholder:
                # If the cell is equal to the placeholder, it means that it was an empty string originally
                row[i] = ''
            else:
                # Handle doubles quotes inside a cell
                row[i] = cell.replace(empty_string_placeholder, quotechar)
        print(row)

首先,它执行一个预处理步骤,将空字符串转换为占位符值;然后,它让csv模块解析输入;最后,当从csv文件阅读值时,它使用占位符值来区分空字符串和未定义值。
我使用以下csv文件运行此脚本:

Id,Name,Description
1,,"Test"
,,
3,"Abc","Def"
,"Ghi",
5,"String ""with"" quotes","Test"

上面写着:

['Id', 'Name', 'Description']
['1', None, 'Test']
[None, None, None]
['3', 'Abc', 'Def']
[None, 'Ghi', None]
['5', 'String "with" quotes', 'Test']

相关问题