Python:csv.Dictreader 列上的额外逗号

标签 python python-3.x file csv reader

我有这个读取函数,它使用 csv.DictReader 读取 csv 文件。 file.csv 以逗号分隔,可完整读取。但是,我的文件的这一部分有一列包含多个逗号。我的问题是,如何确保逗号算作列的一部分?我无法更改 csv 文件以满足标准。

文本文件:

ID,Name,University,Street,ZipCode,Country
12,Jon Snow,U of Winterfell,Winterfell #45,60434,Westeros
13,Steve Rogers,NYU,108, Chelsea St.,23333,United States
20,Peter Parker,Yale,34, Tribeca,32444,United States
34,Tyrion Lannister,U of Casterly Rock,Kings Landing #89, 43543,Westeros

所需的输出是这样的:

{'ID': '12', 'Name': 'Jon Snow', 'University': 'U of Winterfell', 'Street': 'Winterfell #45', 'ZipCode': '60434', 'Country': 'Westeros'}
{'ID': '13', 'Name': 'Steve Rogers', 'University': 'NYU', 'Street': '108, Chelsea St.', 'ZipCode': '23333', 'Country': 'United States'}
{'ID': '20', 'Name': 'Peter Parker', 'University': 'Yale', 'Street': '34, Tribeca', 'ZipCode': '32444', 'Country': 'United States'}
{'ID': '34', 'Name': 'Tyrion Lannister', 'University': 'U of Casterly Rock', 'Street': 'Kings Landing #89', 'ZipCode': '43543', 'Country': 'Westeros'}

正如您所见,由于数字的缘故,“街道”至少有两个逗号:

13,史蒂夫罗杰斯,纽约大学,108,切尔西街,23333,美国

20,彼得·帕克,耶鲁大学,34,翠贝卡,32444,美国

注意:大多数读取的列均由 str,str 分割,但在“Street”列下,后面跟着 str, str (逗号后面有一个额外的空格)。我希望这是有道理的。

我尝试寻找的选项是使用 re.split,但我不知道如何在我的读取文件上实现它。我在想re.split(r'(?!\s),(?!\s)',x[:-1])?如何确保我的文件中的格式将计入任何列的一部分?我不能使用 Pandas 。

我当前的输出现在看起来像这样:

{'ID': '12', 'Name': 'Jon Snow', 'University': 'U of Winterfell', 'Street': 'Winterfell #45', 'ZipCode': '60434', 'Country': 'Westeros'}
{'ID': '13', 'Name': 'Steve Rogers', 'University': 'NYU', 'Street': '108', 'ZipCode': 'Chelsea St.', 'Country': '23333', None: ['United States']}
{'ID': '20', 'Name': 'Peter Parker', 'University': 'Yale', 'Street': '34', 'ZipCode': 'Tribeca', 'Country': '32444', None: ['United States']}
{'ID': '34', 'Name': 'Tyrion Lannister', 'University': 'U of Casterly Rock', 'Street': 'Kings Landing #89', 'ZipCode': '43543', 'Country': 'Westeros'}

这是我的阅读功能:

import csv

list = []
with open('file.csv', mode='r') as csv_file:
  csv_reader = csv.DictReader(csv_file, delimiter=",", skipinitialspace=True)

  for col in csv_reader:
    list.append(dict(col))
    print(dict(col))

最佳答案

如果文件不是有效的 CSV 格式,则无法使用 csv

您需要在普通线路上调用 re.split(),而不是在字典上。

list = []
with open('file.csv', mode='r') as csv_file:
    keys = csv_file.readline().strip().split(',') # Read header line
    for line in csv_file:
        line = line.strip()
        row = re.split(r'(?!\s),(?!\s)',line)
        list.append(dict(zip(keys, row)))

关于Python:csv.Dictreader 列上的额外逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55154293/

相关文章:

python - 用于 isinstance() 检查的 dict_keys 的显式 python3 类型是什么?

java - 删除文本文件中较短的字符串

asp.net - 从通过 __doPostBack() 完成的页面中使用 Python 的 urllib 检索信息?

python argparse : arg with no flag

python - Pytest 失败并出现 AssertionError False is False

c# - 从目录中获取文件数而不在 C# 中枚举文件

language-agnostic - 计算文件复制/移动的估计时间?

python - Scrapy Scraper 不会抓取除比第一页更远的内容

python - 如何更改 Kivy 中按钮的背景颜色?

python - 在 Python 中根据 Textblob 的极性获取正面和负面的单词(情感分析)