Python打开具有不同类型分隔符的csv文档



我有一个txt文档,结构如下:

1:0.84722,0.52855;0.65268,0.24792;0.66525,0.46562
2:0.84722,0.52855;0.65231,0.24513;0.66482,0.46548
3:0.84722,0.52855;0.65197,0.24387;0.66467,0.46537

第一个带冒号的数字是索引,我不知道在打开文件时如何指示它。的确,我想把它抹去。然后用逗号和分号分隔数据,我希望将每个数字放在不同的列中,而不管分隔符是逗号还是分号。我怎么能做到呢?

使用以下命令加载csv文件:

import pandas as pd
df = pd.read_csv("data.csv",  # the file path, change it to your filename 
sep="[,;:]",  # the separator use a regular expression
engine="python",  # need this to use regular expression as sep
usecols=range(1, 7),  # use columns from [1, 7)
header=None  # no header
)
print(df)

1        2        3        4        5        6
0  0.84722  0.52855  0.65268  0.24792  0.66525  0.46562
1  0.84722  0.52855  0.65231  0.24513  0.66482  0.46548
2  0.84722  0.52855  0.65197  0.24387  0.66467  0.46537

注意
加载文件后,我建议将其保存(使用to_csv)为适当的csv文件。

当您使用pandas时。read_csv已经完成了,只要看一下它的文档,找到参数sep:

使用的分隔符。如果sep为None,则C引擎无法自动检测分隔符,但Python解析引擎可以,这意味着Python的内置嗅探工具csv.Sniffer将使用后者并自动检测分隔符。此外,大于1个字符且不同于's+'的分隔符将被解释为正则表达式并且还将强制使用Python解析引擎。注意,正则表达式分隔符容易忽略加引号的数据。正则表达式示例:'rt'.

因此,在您的情况下,只需调用pandas.read_csv(..., sep='[,;:]')就可以了。

首先将其作为常规文本加载(没有.csv解析器)。删除所有不需要的文本,列…

要去掉第一个数字,可以用:分线,只保留第二部分。

其余部分用replace(",", ";")代替

现在你有一个漂亮的。csv,你可以立即读取和解析。

对于使用多个分隔符,您可以传递像:|,|;这样的regex模式,它基本上表示这些中的任何一个。

对于不使用第一列-您可以使用usecols

指定列engine="python"规范是可选的,因为长度超过1个字符的分隔符将强制使用python引擎。

x = '''1:0.84722,0.52855;0.65268,0.24792;0.66525,0.46562
2:0.84722,0.52855;0.65231,0.24513;0.66482,0.46548
3:0.84722,0.52855;0.65197,0.24387;0.66467,0.46537'''
xf = io.StringIO(x)
df = pd.read_csv(xf, sep=":|,|;", engine='python', header=None, usecols=list(range(1, 7)))
print(df)
#         1        2        3        4        5        6
#0  0.84722  0.52855  0.65268  0.24792  0.66525  0.46562
#1  0.84722  0.52855  0.65231  0.24513  0.66482  0.46548
#2  0.84722  0.52855  0.65197  0.24387  0.66467  0.46537