【问题标题】:Finding the header in a large txt file pandas在大 txt 文件 pandas 中查找标题
【发布时间】:2021-09-27 09:39:19
【问题描述】:

假设我有一个包含几百万行的大文件。前 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 是字符串还是文件对象?
  • 除非第一列的名称不是 #CHROM(包括 #),否则这不是有效的 csv 文件。如果标题行删除了#(通过任何方式,例如预处理),您可以简单地在pd.read_csv 中设置comment='#'。如果第一列的名称确实是#CHROM,那么最好选择另一个字符,因为这不能让您与注释行区分开来(同样,除非这些不以# 开头(此处有额外空格),那么您可以设置@ 987654336@).
  • 我没有将文件称为 csv 文件。我称它为文本文件。前几百行具有注释格式,但标题也是如此。这就是我问这个问题的原因!

标签: python pandas


【解决方案1】:

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

设置一个变量作为标题行,

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

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

【讨论】:

  • 您可能需要定义分隔符,具体取决于表格的结构
【解决方案2】:

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

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

因为我的 infile 很大,也有 300+ 列,所以我发现这是传递可变数量 header 的好方法,函数调用示例:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多