在大的txt文件中找到标题pandas

时间:2018-11-29 23:27:00

标签: python python-3.x pandas

假设我有一个大文件,有几百万行。前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()相同,并且可能有效。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

将变量设置为标题行

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

然后,当您导入文件时,您可以执行类似pd.read_table('my_file.txt',header = headerrow)以及所需的任何其他参数的操作。

答案 1 :(得分:0)

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

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)