Python 跳过未知行数以读取标题

Python 跳过未知行数以读取标题,python,pandas,Python,Pandas,我有一个excel数据,我用python熊猫读入: import pandas as pd data = pd.read_csv('..../file.txt', sep='\t' ) 模拟数据如下所示: unwantedjunkline1 unwantedjunkline2 unwantedjunkline3 ID ColumnA ColumnB ColumnC 1 A B C 2 A

我有一个excel数据,我用python熊猫读入:

import pandas as pd
data = pd.read_csv('..../file.txt', sep='\t' )
模拟数据如下所示:

unwantedjunkline1
unwantedjunkline2
unwantedjunkline3
 ID     ColumnA     ColumnB     ColumnC
 1         A          B            C
 2         A          B            C
 3         A          B            C
...
本例中的数据在命中标题之前包含3个垃圾行(我不想读入的行),有时包含4个或更多垃圾行。因此,在本例中,我读入了数据:

data = pd.read_csv('..../file.txt', sep='\t', skiprows = 3 )
数据如下所示:

 ID     ColumnA     ColumnB     ColumnC
 1         A          B            C
 2         A          B            C
 3         A          B            C
...

但是每次不需要的行数不同时,是否有一种方法可以使用pandas读取表文件,而不使用“skiprows=”,而是使用一些与标题匹配的命令,以便它知道从标题开始读取?因此,我不必单击“打开文件”来计算文件每次包含多少不需要的行,然后手动更改“skiprows=”选项。

如果您知道标题的开头:

def skip_to(fle, line,**kwargs):
    if os.stat(fle).st_size == 0:
        raise ValueError("File is empty")
    with open(fle) as f:
        pos = 0
        cur_line = f.readline()
        while not cur_line.startswith(line):
            pos = f.tell()
            cur_line = f.readline()
        f.seek(pos)
        return pd.read_csv(f, **kwargs)
演示:

通过调用
.tell
我们可以跟踪上一行的指针位置,因此当我们点击标题时,我们会返回到该行并将文件对象传递给pandas

或者使用垃圾,如果他们都是从共同点开始的:

def skip_to(fle, junk,**kwargs):
    if os.stat(fle).st_size == 0:
        raise ValueError("File is empty")
    with open(fle) as f:
        pos = 0
        cur_line = f.readline()
        while cur_line.startswith(junk):
            pos = f.tell()
            cur_line = f.readline()
        f.seek(pos)
        return pd.read_csv(f, **kwargs)

 df = skip_to("test.txt", "junk",sep="\t")

你自己跳过这些行,然后传递一个文件object@Padraic坎宁安对不起?我不遵循使用
open
创建文件对象,在文件对象中迭代,直到到达垃圾的末尾(您必须了解如何评估),然后将文件对象传递到
pd.read\u csv(fileobject,…)
而不是文件路径。@Jessica,我添加了一个答案,一旦你知道了头,你就把它传递给函数,带有readline和tell的逻辑才是最重要的,你可以用它做任何你想做的事情,比如获取更多的参数或者仅仅使用逻辑,它只是一个example@Jessica,因为您需要通过
sep=“\t”
,我添加了一个选项来传递将被传递到read_csv的关键字,我的编辑也遗漏了一个
而不是
;0如何将此函数更改为输出excel文件而不是.csv?我试过了,但我一直得到的错误是:UnicodeDecodeError:“charmap”编解码器在应用于读取excel文件时,无法将位置17:字符映射到的字节0x8d解码。@Jessica,在打开的calli中设置
encoding=“utf8”
尝试了“encoding='latin-1'没有错误消息,但也没有输出,脚本似乎永远在运行@帕德雷克Cunningham@Jessica,您需要指定正确的编码,否则可能会导致垃圾,您知道数据编码到的实际编码吗?此外,就永远运行而言,如果文件非常大,解析可能需要相当长的时间,while循环不可能永远结束,因为它在匹配或EOF上停止。
def skip_to(fle, junk,**kwargs):
    if os.stat(fle).st_size == 0:
        raise ValueError("File is empty")
    with open(fle) as f:
        pos = 0
        cur_line = f.readline()
        while cur_line.startswith(junk):
            pos = f.tell()
            cur_line = f.readline()
        f.seek(pos)
        return pd.read_csv(f, **kwargs)

 df = skip_to("test.txt", "junk",sep="\t")