Python:csv.Dictreader列上的多余逗号

时间:2019-03-14 02:59:16

标签: 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,Steve Rogers,NYU, 108,Chelsea St。,23333,美国

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

注意:多数要读取的列均由“街道”列下的 str,str BUT拆分,其后是 str,str < / strong>(逗号后还有多余的空格)。我希望这是有道理的。

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

我当前的输出现在是这样的:

{'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))

2 个答案:

答案 0 :(得分:1)

如果文件不是有效的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)))

答案 1 :(得分:0)

该问题的实际解决方案是修改生成csv文件的脚本。

如果您有机会修改该输出,则可以做两件事

  • 使用逗号以外的定界符,例如|符号或;,无论您认为字符串中是否不存在定界符。
  • 或者将所有列都用"括起来,这样就可以用,对其进行分隔,它们是实际的分隔符。

如果您没有机会修改输出。

如果您确定只有逗号在“街道”列中,则可以;那么您应该使用csv.reader而不是DictReader来通过已确定的索引获取列。例如row[0]将是ID row[1]将是Name并且row[-1]将是Country row[-2]将是{{1} },因此ZipCode会给您您所需要的东西。索引可以安排,但我想这个主意很清楚。

希望有帮助。


编辑:

row[2:-2]

- 这是输出(带有pprint)

import csv

list = []
with open('file.csv', mode='r') as csv_file:
  csv_reader = csv.reader(csv_file, delimiter=",", skipinitialspace=True)
  # pass the header row
  next(csv_reader)
  for row in csv_reader:
  list.append({"ID": row[0],
               "Name": row[1],
               "University": row[2],
               "Street": ' '.join(row[3:-2]),
               "Zipcode": row[-2],
               "Country": row[-1]})
print(list)

-第二次编辑 在大街上编辑索引。 问候。