如何读取 pandas 包含引号并使用多个分隔符的 CSV 文件
How to read CSV file with pandas containing quotes and using multiple seperators
我正在做一个项目,我在一个 for 循环中读取多个 CSV 文件,一些文件包含一个分号 (;) 作为分隔符,而其他文件包含一个逗号 (,)。我需要在所有 CSV 文件中保留 headers,所以我不能使用 fixed headers.
我在处理一个 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、示例
我想像处理其他文件一样成功地处理此文件,同时保持使用能力:
- 文件headers
- 多个分隔符(, 或 ;)
我尝试将引号之间的 , 替换为 .但这并不能消除在行的前端和末尾添加引号的问题,而且它根本不起作用,因为它原来是两个引号..
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)
我建议用单个出现的逗号前后替换多个 "
的块,然后将 pd.read_csv
与 quotechar='"'
参数一起使用以确保引用的字段最终出现在单列中:
content = re.sub(r'(?<![^,])"{2,}|"{2,}(?![^,])', '"', content)
#...
combined_csv = pd.read_csv(csv, sep=";|,", engine="python", quotechar='"')
正则表达式详细信息:
(?<![^,])
- 在当前位置之前,必须有逗号或字符串开头
"{2,}
- 两个或更多 "
个字符
|
- 或
"{2,}
- 两个或更多 "
个字符
(?![^,])
- 在当前位置之后,必须有逗号或字符串结尾。
我正在做一个项目,我在一个 for 循环中读取多个 CSV 文件,一些文件包含一个分号 (;) 作为分隔符,而其他文件包含一个逗号 (,)。我需要在所有 CSV 文件中保留 headers,所以我不能使用 fixed headers.
我在处理一个 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、示例
我想像处理其他文件一样成功地处理此文件,同时保持使用能力:
- 文件headers
- 多个分隔符(, 或 ;)
我尝试将引号之间的 , 替换为 .但这并不能消除在行的前端和末尾添加引号的问题,而且它根本不起作用,因为它原来是两个引号..
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)
我建议用单个出现的逗号前后替换多个 "
的块,然后将 pd.read_csv
与 quotechar='"'
参数一起使用以确保引用的字段最终出现在单列中:
content = re.sub(r'(?<![^,])"{2,}|"{2,}(?![^,])', '"', content)
#...
combined_csv = pd.read_csv(csv, sep=";|,", engine="python", quotechar='"')
正则表达式详细信息:
(?<![^,])
- 在当前位置之前,必须有逗号或字符串开头"{2,}
- 两个或更多"
个字符|
- 或"{2,}
- 两个或更多"
个字符(?![^,])
- 在当前位置之后,必须有逗号或字符串结尾。