Pandas:使用“sep”和“comment”参数读取 CSV 文件时出错

Xuk*_*rao 5 python csv pandas

情况

我必须从类似 CSV 的文件创建一个 pandas 数据框,该文件具有以下特征:

  • 文件使用的分隔符可以是逗号或空格,并且我事先不知道文件将使用哪一个。
  • 文件顶部可以有一个或多个注释行,以#.

问题

我尝试使用pd.read_csv带有参数sep=None和 的方法来解决这个问题comment='#'。据我了解,该sep=None参数告诉 pandas 自动检测分隔符,并且该comment='#'参数告诉 pandas 所有以 开头的行#都是应该被忽略的注释行。

这些参数单独使用时效果很好。但是,当我同时使用它们时,我收到错误消息TypeError: expected string or bytes-like object。以下代码示例演示了这一点:

from io import StringIO
import pandas as pd

# Simulated data file contents
tabular_data = (
    '# Data generated on 04 May 2017\n'
    'col1,col2,col3\n'
    '5.9,7.8,3.2\n'
    '7.1,0.4,8.1\n'
    '9.4,5.4,1.9\n'
)

# This works
df1 = pd.read_csv(StringIO(tabular_data), sep=None)
print(df1)

# This also works
df2 = pd.read_csv(StringIO(tabular_data), comment='#')
print(df2)

# This will give an error
df3 = pd.read_csv(StringIO(tabular_data), sep=None, comment='#')
print(df3)
Run Code Online (Sandbox Code Playgroud)

不幸的是我真的不明白是什么触发了错误。这里有人能给我一些帮助来解决这个问题吗?

Max*_*axU 4

尝试这个:

In [186]: df = pd.read_csv(StringIO(tabular_data), sep=r'(?:,|\s+)',
                           comment='#', engine='python')

In [187]: df
Out[187]:
   col1  col2  col3
0   5.9   7.8   3.2
1   7.1   0.4   8.1
2   9.4   5.4   1.9
Run Code Online (Sandbox Code Playgroud)

'(?:,|\s+)'- 是一个正则表达式,用于选择逗号或任意数量的连续空格/制表符