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

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

我有这个读取功能,它使用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'}

正如您所知,由于数字,'Street'至少有两个逗号:

13,Steve Rogers,NYU,108,Chelsea St.,23333,United States

20,Peter Parker,耶鲁,34岁,翠贝卡,32444,美国

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

我试图查看的选项是使用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))
python python-3.x file csv reader
2个回答
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)))

0
投票

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

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

  • 使用除逗号之外的分隔符,例如|符号或;,无论您认为它在字符串中不存在。
  • 或者用"封闭所有列,这样你就可以通过,将它们拆分为实际的分隔符。

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

如果您确定多个逗号只在街道列中;然后你应该使用csv.reader而不是DictReader,这样你就可以通过Indexes获得你已经确定的列。例如row[0]将是ID row[1]将是Namerow[-1]将是Country row[-2]将是ZipCode所以row[2:-2]将给你你需要我猜。索引可以安排,但我想这个想法很清楚。

希望有所帮助。


编辑:

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)

- 这是输出(带pprint)

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

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

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