Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过python将生成的文本文件转换为tsv数据格式?_Python_Csv - Fatal编程技术网

如何通过python将生成的文本文件转换为tsv数据格式?

如何通过python将生成的文本文件转换为tsv数据格式?,python,csv,Python,Csv,因此,我有一个以下格式的文本文件: Splice site predictions for 46 sequences with donor score cutoff 0.40, acceptor score cutoff 0.40 (exon/intron boundary shown in larger font): Acceptor site predictions for MFSD8 : Start End Score Intron Exon

因此,我有一个以下格式的文本文件:

Splice site predictions for 46 sequences with donor score cutoff 0.40, acceptor score cutoff 0.40 (exon/intron boundary shown in larger font):
Acceptor site predictions for MFSD8 :
Start   End    Score     Intron               Exon
1       41     0.96      atttgtgtttttctttttaagagaacatcgtgtggatgact

Donor site predictions for CEP290 :

Start   End    Score     Exon   Intron
1       15     0.72      acttcaggtatactc
id        type         score    seq
MFSD8     acceptor     0.96     atttgtgtttttctttttaagagaacatcgtgtggatgact
CEP290    donor        0.72     acttcaggtatactc
文件中还有更多这样的重复格式条目。我想将其转换为以下格式的TSV文件:

Splice site predictions for 46 sequences with donor score cutoff 0.40, acceptor score cutoff 0.40 (exon/intron boundary shown in larger font):
Acceptor site predictions for MFSD8 :
Start   End    Score     Intron               Exon
1       41     0.96      atttgtgtttttctttttaagagaacatcgtgtggatgact

Donor site predictions for CEP290 :

Start   End    Score     Exon   Intron
1       15     0.72      acttcaggtatactc
id        type         score    seq
MFSD8     acceptor     0.96     atttgtgtttttctttttaagagaacatcgtgtggatgact
CEP290    donor        0.72     acttcaggtatactc
因此,行中写入的接受者或捐赠者成为“type”,id写入for之后,score和seq从各自的头中使用。我正在尝试以下代码:

for line in file.readlines():
    ENTRY = copy.deepcopy(ENTRY_T)
    site_type, gene, score, seq = ['','','','']

    ENTRY['predictor'] = 'NNSplice'
    line_elements = line.split()
    if line_elements[0] == 'Donor' or line_elements[0] == 'Acceptor':
        ENTRY['splice_site_type'] = line_elements[0]
        ENTRY['Gene_name'] = line_elements[-2]
    elif line_elements[0] == 'Start':
        pass
    elif int(line_elements[0]).isdigit():
        ENTRY['sequence'] = line_elements[-1]
        ENTRY['score'] = line_elements[-2]
    elif line_elements == []:
        pass

    field_values = [ENTRY[i] for i in HEADERS]
    print(field_values)

有什么建议吗?

您需要一行一行地解析文件,以提取所需的位。下面的代码显示了一种可能的方法

首先,它一次读取一行文本文件。它可以识别出它是一个
接受者
还是
捐赠者
部分。如果是这样,它将从行的末尾提取ID供以后使用

然后,它获取文本行并使用Python的CSV阅读器将其拆分为可能的元素。如果元素数为
4
,则假定这是一个有效的数据行。然后,它使用行元素构造合适的输出行

csv.writer()
与制表符分隔符一起用于写入输出文件

import csv
from io import StringIO

with open('predictions.txt') as f_predictions, open('output.tsv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output, delimiter='\t')
    csv_output.writerow(['id', 'type', 'score', 'seq'])

    for line in f_predictions:
        if line.startswith('Acceptor'):
            type = 'acceptor'
            id = line.split(' ')[4]
        elif line.startswith('Donor'):
            type = 'donor'
            id = line.split(' ')[4]
        else:
            row = next(csv.reader(StringIO(line), delimiter=' ', skipinitialspace=True))

            if len(row) == 4:
                csv_output.writerow([id, type, row[2], row[3]])
对于给定的文件,这将为您创建一个输出选项卡分隔的输出文件,如下所示:

id类型得分顺序
MFSD8受体0.96 ATTTGTTTTTTTTTTTTAGAGACATCGTGTGGACT
CEP290捐赠者0.72 ACTTCAGTACTACTC

Hi Sayatan,你能告诉我们你首先尝试了什么代码吗?到底是什么问题?你试过什么,做过什么研究吗?堆栈溢出不是免费的代码编写服务。请参阅:,@AMC我非常清楚堆栈交换的用途,是的,我做过研究。你可以用一种更礼貌的语气来解释上述问题,没有人强迫你回答。