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