在一个大的文本文件中查找标题 pandas

4
假设我有一个包含数百万行的大文件。前面的300+(可变数量)行包含关于文件的信息,然后是数据前的标题行。我不知道标题行在哪一行,但我知道它以什么开头。以下是我的数据样例:
#This File contains some cool suff
#We will see what line the header is on
#Maybe it is in this line
#CHROM POS ID 
1 100 17
2 200 18
2 300 18

头部行为#CHROM POS ID

这是我尝试的代码,但它返回list index out of range

database = pd.read_table(infile, header=[num for num,line in enumerate(infile) if line.startswith("#CHROM")])

我曾天真地认为pd.read_table的操作方式与with open()相同,这可能起了作用。任何帮助都将不胜感激!

infile 是一个字符串还是一个文件对象? - Jarad
除非第一列的名称不是#CHROM(包括“#”),否则这不是一个有效的csv文件。如果标题行已经去掉了“#”(例如,通过预处理),则可以在pd.read_csv中简单地设置comment ='#'。 如果第一列的名称确实是#CHROM,则最好选择另一个字符,因为这不能让您与注释行区分开来(除非这些行不以开头(此处添加了附加空格) ,那么您可以设置comment ='#')。 - a_guest
我没有把文件称为csv文件,而是称为文本文件。前几百行采用注释格式,但标题也是如此。这就是我提出问题的原因! - d_kennetz
2个回答

1

编辑:刚刚看到这是一个文本文件

将变量设置为headerrow,

lineno = 0
for line in infile.readlines():
    if line.startswith('#CHROM'):
        headerrow = lineno
    lineno += 1

然后当你导入文件时,你可以像这样做:pd.read_table('my_file.txt', header=headerrow),再加上你需要的其他参数。


你可能需要定义分隔符,这取决于表格的结构。 - db702

1

我发现这对于我的特定应用——在大型文本文件中查找标题,非常有效。首先,编写一个函数逐行读取,直到找到匹配项:

def headerFinder(infile):
    with open(infile) as f:
        for num,line in enumerate(f):
            if line.startswith("#CHROM"):
                return num

这段代码将列举文件中的每一行并找到匹配的行,然后您可以将函数调用传递给pd.read_table()函数,如下所示:

def tableReader(infile, *argv):
    df = pd.read_table(infile, header=headerFinder(infile), usecols=argv)
    return df

由于我的输入文件很大,同时有300多列,所以我发现这是传递可变数量的标题的好方法,以下是函数调用示例:
tableDF = tableReader(input_file, '#CHROM', 'POS', 'ID', 'REF', 'ALT', 'INFO')

我的整个小程序如下:

import pandas as pd
import sys

input_file = sys.argv[1]

def headerFinder(infile):
    with open(infile) as f:
        for num,line in enumerate(f):
            if line.startswith("#CHROM"):
                return num

def tableReader(infile, *argv):
    df = pd.read_table(infile, header=headerFinder(infile), usecols=argv)
    return df

tableDF = tableReader(input_file, '#CHROM', 'POS', 'ID', 'REF', 'ALT', 'INFO')

#to view as test of success

(tableDF[:10]).to_csv('./test_table', sep='\t', index=False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接