从非修复标头开始的 csv 读取 pandas 数据帧

Posted

技术标签:

【中文标题】从非修复标头开始的 csv 读取 pandas 数据帧【英文标题】:Read pandas dataframe from csv beginning with non-fix header 【发布时间】:2013-12-12 08:43:51 【问题描述】:

我有一些数据文件是由我实验室中使用的一些相当老套的脚本生成的。该脚本非常有趣,因为它在标题之前附加的行数因文件而异(尽管它们具有相同的格式并且具有相同的标题)。

我正在编写一个批处理来将所有这些文件处理为数据帧。如果我不知道位置,如何让熊猫识别正确的标题?我知道确切的 heder 文本,以及它之前的两行文本(它们是文档中 \r\n 的唯一连续实例)。

我尝试在文档末尾定义空跳并选择每个文件包含的(谢天谢地)固定数量的数据行:

df = pd.read_csv(myfile, skipfooter=0, nrows=267)

那没用。

你还有什么想法吗?

【问题讨论】:

不确定是否有更好的 Pandas 方法,但您可以预先读取 csv 文件,计算空行数,然后使用 read_csv 的 skiprows 命名参数吗? pandas.pydata.org/pandas-docs/stable/generated/… 【参考方案1】:

您可以打开文件并对其进行迭代,直到遇到连续的\r\n,并将结果传递给解析器,即

with open(csv_file_name, 'rb') as source:
    consec_empty_lines = 0
    for line in source:
        if line == '\r\n':
            consec_empty_lines += 1
            if consec_empty_lines == 2: 
                break
        else:
            consec_empty_lines = 0
    df = pd.read_csv(source)

【讨论】:

hmmm... 显然 if 语句不会对我的两个空行做出反应 - 两个空行表示 '\n\n' - 对吧?我的文档中的这些行上也没有制表符或空格...:-/ @TheChymera Imho,两个空行被读取为两个连续的\n,但您可以测试并查看。由于您没有提供任何测试数据,因此我没有对其进行测试。我希望您能理解并详细说明满足您特定需求的解决方案。 我可以打印原始文本吗? @TheChymera 我不完全明白你的问题。出于测试目的,您可以在循环中添加print line 以检查跳过的行,或将df = ... 替换为print source.read() 以检查剩余内容。运行批处理时不要忘记更换东西。 找到了方法——答案是print repr(line)——这让我看到了“空”行实际包含的内容。所以他们俩实际上都有\r\n。这使得找到它们变得更加成问题,因为我还有其他包含它的行(也在变量编号 0.o 中) - 我只需要考虑一些(〜nice)方法来检查唯一的这些行彼此跟随。

以上是关于从非修复标头开始的 csv 读取 pandas 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Pandas读取csv时设置列名

python的pandas库读取csv

用pandas编写单个CSV标头

当列数事先未知时如何访问 Pandas 数据框列

解析 CSV 标头

无法从带有Pandas的CSV标头中删除空格