【发布时间】:2021-08-20 01:44:00
【问题描述】:
我正在做一个项目,我在 for 循环中读取多个 CSV 文件,一些文件包含一个分号 (;) 作为分隔符,而其他文件包含一个逗号 (,)。我需要在所有 CSV 文件中保留标题,所以我不能使用固定标题。
我在处理一个 CSV 文件时遇到问题,尤其是包含某些值的引号,例如
第 1 列、第 2 列、第 3 列、第 4 列 12531,ABCDE,"12523,2",示例 52313,ADE,12302,示例
使用逗号作为分隔符不起作用,因为我最终得到 15 个值而不是 13 个导致解析错误。
在记事本中打开文件时,我看到对于包含带引号的值的行,双引号会添加到所述值,并且逗号会添加到行的开头和结尾:
第 1 列、第 2 列、第 3 列、第 4 列 "12531,ABCDE,""12523,2"",示例" 52313,ADE,12302,示例
我想像其他文件一样成功处理此文件,同时保持使用能力:
- 文件头
- 多个分隔符(, 或;)
我尝试将引号之间的 , 替换为 .但这并不能消除将引号添加到行首和行尾的问题,而且它根本不起作用,因为它原来是两个引号..
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
for csv in all_filenames:
file = open(csv, 'r')
content = file.read()
content = re.sub(r'(?!(([^"]*"){2})*[^"]*$),', '.', content)
combined_csv = pd.read_csv(csv, sep=";|,", engine="python")
appended_data.append(combined_csv)
appended_data = pd.concat(appended_data)
【问题讨论】:
-
虽然
quotechar默认为",请尝试将quotechar='"'参数添加到pd.read_csv。 -
这似乎适用于开始和结束引号,但是“12523,2”的问题减少到分隔符变量无法处理的“12523,2”
-
好的,然后试试
content = re.sub(r'(?<![^,])""|""(?![^,])', '"', content),然后combined_csv = pd.read_csv(csv, sep=";|,", engine="python", quotechar='"') -
非常感谢!正是我想要的。
标签: python regex pandas csv re