在 excel 中区分定界符和内容字符

In excel differentiate delimiters from content characters

我有一个 excel .csv 文件,看起来像这样

id,ticker1,ticker2,Company,Supplier
9,MMM,DHR,3M Company,Danaher Corporation
10,MMM,IBM,3M Company,International Business Machines Corporation
11,MMM,UNP,3M Company,Union Pacific Corporation
12,MMM,TMO,3M Company,Thermo Fisher Scientific Inc.
13,MMM,NSC,3M Company,Norfolk Southern Corporation
61,No,0,,
14,MMM,TER,3M Company,"Teradyne, Inc."

这里的数据用逗号分隔,所以我使用 delimiter=',',但在某些情况下,如最后一行,文本中也有逗号。在我的 csv 文件中,所有带逗号的字符串都在引号 " " 中。我试图用 open()

读取文件

with open('file.csv','r') as f:
    for row in f.read().split('\n'):

但是这样我必须处理逗号和空值。所以我很好奇处理损坏的 csv 文件的正确方法是什么?我应该使用正则表达式还是像 pandas 这样的库?

我建议这样做:

with open('file.csv','r') as f:
content = f.read()
content = content.split('\n') #split paragraph
data = []
for i in content:
    data.append(i.split(',')) #split each value

预期结果将是一个列表列表。所有丢失的数据都将表示为“”,您可以在“内容”循环期间更改为其他表示。

在我的具体情况下,"Teradyne, Inc."之前文本中的所有逗号,所以我使用替换函数 string.replace(', Inc','') 删除了逗号。在我删除文本中的逗号后,我可以 split(',') 每个 row/line 如下面的答案 中所述

你应该使用 pythons csv 模块。它正是为此目的而设计的。消除诸如解析 csv 数据(其中分隔符可以出现在字段中等)的复杂性

这是一个简单的例子。我使用 csv 模块 DictReader 这将读取 CSV 的第一行作为键名,然后将每个后续行映射为键值。它会自动处理供应商字段中的逗号。

import csv

with open("sample.csv") as my_csv:
    for row in csv.DictReader(my_csv):
        print(f'id {row["id"]} has supplier "{row["Supplier"]}"')

输出

id 9 has supplier "Danaher Corporation"
id 10 has supplier "International Business Machines Corporation"
id 11 has supplier "Union Pacific Corporation"
id 12 has supplier "Thermo Fisher Scientific Inc."
id 13 has supplier "Norfolk Southern Corporation"
id 61 has supplier ""
id 14 has supplier "Teradyne, Inc."