查找多行制表符分隔文件

时间:2018-04-25 11:03:08

标签: python pandas csv tabs bioinformatics

我正在研究一系列制表符分隔的文件,这些文件的结构略显奇怪。它们使用bam-headcount包创建,并包含DNA序列短读取中每个位置的序列数据和变体调用。

在某些位置,没有变种呼叫,在其他位置可能有很多。每行中的选项卡/列数取决于所做的变体调用的数量(每个变体将占用一个新列)。例如:

234    A    3bp_del    4bp_ins
235    G
236    G.   15bp_ins   3bp_del    5bp_del

使用以下方法解析使用pandas的文件时出现困难:

import pandas as pd
df = pd.read_csv(FILE, sep='\t')

这会返回错误消息:

  

pandas.errors.ParserError:标记数据时出错。 C错误:第3行预计4个字段,见5

发生错误是因为pandas使用第一行中的列数确定了它希望看到的列数。我有一个笨拙的解决方法,在解析之前将一个包含多个列的标题添加到文件中,但它总是会附加相同数量的标题。例如:

Pos    Ref  Call1      Call2       Call3
234    A    3bp_del    4bp_ins
235    G
236    G.   15bp_ins   3bp_del    5bp_del

我正在寻找一种方法来计算具有最大列数的行中的选项卡数量,以便我可以编写一个脚本,以便在解析之前将多个列标题附加到每个CSV文件的第一行。< / p>

1 个答案:

答案 0 :(得分:0)

要计算一行中文本块的数量,可以使用正则表达式计算每行的非空白文本块(最后选择最大值):

import re

column_counter = re.compile('\S+')

columns = []

with open( yourfile, 'r') as dna_file:
    for line in dna_file:
        columns.append(len(column_counter.findall(line)))

max_col_nr = max(columns)

也无需向csv文件添加标头。您可以通过在加载文件时命名列来克服这个问题:

col_names = ['col_' + str(i) for i in range(max_col_nr)]

your_dataframe = pd.read_csv(yourfile, sep = '\t', names = col_names)

如果内存不是问题,您还可以将每一行存储在列表中,并将此列表转换为数据帧,因此您无需加载文件两次:

import re
import pandas as pd

rows = []

with open( yourfile, 'r') as dna_file:
    for line in dna_file:
        rows.append(re.findall('\S+',line))

dna_data = pd.DataFrame(rows)