我有这个读取功能,它使用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))
如果文件不是有效的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)))
该问题的实际解决方案是修改生成csv文件的脚本。
如果您有机会修改该输出,您可以做两件事
|
符号或;
,无论您认为它在字符串中不存在。"
封闭所有列,这样你就可以通过,
将它们拆分为实际的分隔符。如果您没有机会修改输出。
如果您确定多个逗号只在街道列中;然后你应该使用csv.reader
而不是DictReader
,这样你就可以通过Indexes获得你已经确定的列。例如row[0]
将是ID
row[1]
将是Name
和row[-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'}]
- 第二次编辑在街道上编辑了索引。问候。