我有这个读取功能,它使用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))
答案 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)
-第二次编辑 在大街上编辑索引。 问候。