使用 Pandas 读取多个分隔方式的文件
Posted 末世灯光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Pandas 读取多个分隔方式的文件相关的知识,希望对你有一定的参考价值。
如果您的文本文件的第一行数据是使用逗号分隔的,而其余行是使用 tab 分隔的,您需要在 Pandas 中使用 read_csv 函数,并使用正则表达式指定多个分隔符。
1,2,3,4,5,6
a b c d e f
z x c v b n
以下是如何使用 Pandas 读取该文件的代码:
import pandas as pd
# 读取文本文件,使用正则表达式指定多个分隔符,并将第一行作为列名
df = pd.read_csv('data.txt', sep=r'[,\\t]', engine='python', header=0)
# 打印数据框
print(df)
输出结果应为:
1 2 3 4 5 6
0 a b c d e f
1 z x c v b n
这里的 sep 参数使用了正则表达式 [,\\t]
,表示分隔符可以是逗号或者 tab。engine 参数指定了解析器的引擎,这里我们选择了 Python 自带的解析器。最后,header=0 参数告诉 Pandas 使用第一行作为列名。
如何使用包含引号并使用多个分隔符的 pandas 读取 CSV 文件
【中文标题】如何使用包含引号并使用多个分隔符的 pandas 读取 CSV 文件【英文标题】:How to read CSV file with pandas containing quotes and using multiple seperators 【发布时间】: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='"')
非常感谢!正是我想要的。
【参考方案1】:
我建议在逗号之前或之后替换多个 "
的块,然后将 pd.read_csv
与 quotechar='"'
参数一起使用,以确保引用的字段最终出现在单个列中:
content = re.sub(r'(?<![^,])"2,|"2,(?![^,])', '"', content)
#...
combined_csv = pd.read_csv(csv, sep=";|,", engine="python", quotechar='"')
正则表达式详细信息:
(?<![^,])
- 在当前位置之前,必须有逗号或字符串开头
"2,
- 两个或更多 "
字符
|
- 或
"2,
- 两个或更多 "
字符
(?![^,])
- 紧跟在当前位置之后,必须有逗号或字符串结尾。
【讨论】:
以上是关于使用 Pandas 读取多个分隔方式的文件的主要内容,如果未能解决你的问题,请参考以下文章
python pandas 中文件的读写——read_csv()读取文件