удаление некоторых строк из текстового файла в pandas и создание нового файла

У меня есть текстовый файл со сложной структурой, и я хотел бы создать файл, разделенный табуляцией, с 10 столбцами. Проблема заключается в начале этого файла, есть несколько бесполезных строк, которые должны быть удалены. в этом файле есть строка, начинающаяся с #CHROM, которая будет первой строкой результирующего текстового файла.

вот пример моего входного файла:

##bcftools_filterCommand=filter -e 'SOMATIC_PON_COUNT!="." && MIN(SOMATIC_PON_COUNT) > 3' -s SOMATIC_PON -m+ -O z -o /sample/output/180614_HMFregCPCT_FR16985640_FR16985806_CPCT02170033/somaticVariants/CPC
T02170033R_CPCT02170033T/CPCT0217003ted.pon
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  CPCT02170033T
1   819393  .   T   C   .   PASS    AC=0;AF=0;AN=0;MAPPABILITY  GT:AD:DP    0/1:75,15:91

ожидаемый результат (с 2 строками):

CHROM   POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  CPCT02170033T
1   819393  .   T   C   .   PASS    AC=0;AF=0;AN=0;MAPPABILITY  GT:AD:DP    0/1:75,15:91

для этого я написал следующий код в python3:

with open("myfile.txt") as f:
    total = f.readlines()
    skip_value = total.index("#CHROM\n")
    df = pd.read_csv("myfile.txt", skiprows=skip_value, sep="\t")

но это дает эту ошибку:

ValueError: '#CHROM\n' is not in list

Вы знаете, как исправить код?


person elly    schedule 23.09.2019    source источник
comment
если строка всегда находится в первой строке, почему бы не попробовать skiprows=1 в вашем pd.read_csv   -  person Umar.H    schedule 23.09.2019
comment
@Datanovice: как упоминалось в вопросе, это не первая строка. перед тем, что нужно удалить, всегда будет несколько строк.   -  person elly    schedule 23.09.2019


Ответы (2)


# Import libries
import pandas as pd 

# open the file 
with open("myfile.txt") as f:
    skip_value = 1
    for line in f.readlines():
        if line.split()[0] == "#CHROM":
            skip_value += 1

# Load data from txt with pandas
df = pd.read_csv("myfile.txt", skiprows=skip_value, sep="\t")

# Print the final df
print(df)

Вывод

    #CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  CPCT02170033T
0   1   819393  .   T   C   .   PASS    AC=0;AF=0;AN=0;MAPPABILITY  GT:AD:DP    0/1:75,15:91
person Dinesh Sandaruwan    schedule 23.09.2019

Вы почти у цели, так как total — это список, вам нужно перебрать все элементы, чтобы найти индекс элемента, который соответствует вашей подстроке.

with open('myfile.txt') as f: total = f.readlines() for elem in total: if elem.find('#CHROM') > -1: skip_value = total.index(elem) df = pd.read_csv('myfile.txt, skiprows=skip_value, sep = '\t')

person Danny    schedule 23.09.2019
comment
Извиняюсь за отступ. - person Danny; 23.09.2019