在特定列python中拆分信息?

时间:2015-05-04 15:18:52

标签: python

以下是我的文件的示例:

Type    Variant_class   ACC_NUM dbsnp   genomic_coordinates_hg18    genomic_coordinates_hg19    HGVS_cdna   HGVS_protein    gene    disease sequence_context_hg18   sequence_context_hg19   codon_change    codon_number    intron_number   site    location    location_reference_point    author  journal vol page    year    pmid    entrezid    sift_score  sift_prediction mutpred_score
1   DM  CM920001    rs1800433   null    chr12:9232351:- NM_000014.4 NP_000005.2:p.C972Y A2M Chronicobstructivepulmonarydisease  null    CACAAAATCTTCTCCAGATGCCCTATGGCT[G/A]TGGAGAGCAGAATATGGTCCTCTTTGCTCC   TGT-TAT 972 null    null    2   null    Poller  HUMGENET    88  313 1992    1370808 2   0   DAMAGING    0.594315245478036
1   DM  CM004784    rs74315453  null    chr22:43089410:-    NM_017436.4 NP_059132.1:p.M183K A4GALT  Pksynthasedeficiency(pphenotype)    null    TGCTCTCCGACGCCTCCAGGATCGCACTCA[T/A]GTGGAAGTTCGGCGGCATCTACCTGGACAC   ATG-AAG 183 null    null    2   null    Steffensen  JBC 275 16723   2000    10747952    53947   0   DAMAGING    0.787878787878788
1   DM  CM1210274   null    null    chr22:43089327:-    NM_017436.4 NP_059132.1:p.Q211E A4GALT  NORpolyagglutination    null    CTGCGGAACCTGACCAACGTGCTGGGCACC[C/G]AGTCCCGCTACGTCCTCAACGGCGCGTTCC   CAG-GAG 211 null    null    null    null    Suchanowska JBC 287 38220   2012    22965229    53947   0.79    TOLERATED   null

我想要做的是将第13列中的信息拆分为-标记。在上面的示例文件中,此列包含数据ATG-AAG和CAG-GAG。我想用标签分隔将它分开。

我已尝试过以下代码:

with open('disease_mut_split2.txt') as inf:
    with open('disease_mut_splitfinal.txt', 'w') as outf:
        for line in inf:
            outf.write('\t'.join(line.split('-')))

但是,这也会将-拆分为6列,这是我不想要的。有没有什么办法可以指定要用我的代码分割的列?

2 个答案:

答案 0 :(得分:3)

如果您知道它总是在第13列,请使用切片:

'{}\t{}'.format(line[:13], line[14:])

或者,如果你总是知道它会成为你可以限制分裂数量的第一件事:

>>> x = 'this has - a few - dashes - in it'
>>> x.split('-', maxsplit=1)
['this has ', ' a few - dashes - in it']

如果按列表示您的数据是csv文件(制表符分隔文件的工作方式相同),那么Python的csv模块将为您提供帮助:

with open('infile.txt') as f, open('outfile.txt', 'w') as outfile: 
    reader = csv.reader(f, delimiter='\t')                                         
    writer = csv.writer(outfile, delimiter='\t')                                   
    writer.writerow(next(reader, None))  # Write out the header row                
    for row in reader:   
        # Note: Python lists begin with [0], 
        #       so the 13th column will have an index of 12                                                          
        row[12] = row[12].replace('-', ' ')                                        
        writer.writerow(row)

答案 1 :(得分:1)

假设您正在做的事情实际上正在解析/格式化csv文件Wayne Werner的csv模块方法可能是解决此问题的最有效方法。

作为替代方案,您可以考虑使用re模块中的re.sub。要使用的确切正则表达式取决于数据。例如,如果该列总是3个核苷酸,-和3个核苷酸,那么这样的事情可能有用:

re.sub(r'(?<=[ACTG]{3})-(?=[ACTG]{3})', '\t', line))

正则表达式使用lookbehind和lookahead来替换两组3个核苷酸之间的-,所以假设这种模式不会出现在文件的其他位置,应该可以正常工作。

编辑:已更改为re.sub由于某种原因原始代码让我处于split心态!