Поиск заголовка в большом текстовом файле панды - PullRequest
0 голосов
/ 30 ноября 2018

Предположим, у меня большой файл с несколькими миллионами строк.Первые 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 голосов
/ 05 декабря 2018

Я обнаружил, что это успешно для моего конкретного приложения поиска заголовка в большом текстовом файле.Сначала напишите функцию для чтения построчно, пока не будет найдено совпадение:

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)
0 голосов
/ 30 ноября 2018

РЕДАКТИРОВАТЬ: только что увидел, что это текстовый файл

установить переменную в качестве заголовка,

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

тогда, когда вы вносите в файл, вы можете сделать что-то вроде pd.read_table ('my_file.txt', header = headerrow) плюс любые другие параметры, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...