使用python将三列文件写入新文本文件

使用python将三列文件写入新文本文件,python,python-3.x,bioinformatics,Python,Python 3.x,Bioinformatics,我正在从一个大的.gtf文件中读取数据。下面是它的代码: fname="gencode.v19.annotation.gtf" for line in open(fname,'r'): if not line.startswith('##'): col1=line.split()[0] col3=line.split()[2] col4=line.split()[3] col5=line.split()[4]

我正在从一个大的.gtf文件中读取数据。下面是它的代码:

fname="gencode.v19.annotation.gtf"


for line in open(fname,'r'):
    if not line.startswith('##'):
        col1=line.split()[0]
        col3=line.split()[2]
        col4=line.split()[3]
        col5=line.split()[4]
        if "protein_coding" in line and col3=="exon":
            data = col1,col4,col5
            results=list(data)
            print(results)


dataFile = open('results.txt','w')

for list in results:
    dataFile.writelines(results)

dataFile.close()
在空闲状态下打印的结果如下所示:

['chr1', '120461029', '120461176']
['chr1', '120460288', '120460385']
['chr1', '120454176', '120459317']
['chr1', '120466260', '120466528']
['chr1', '120465118', '120465401']
['chr1', '120479905', '120480086']
['chr1', '120477890', '120478227']
['chr1', '120611948', '120612240']
['chr1', '120547952', '120548211']
(但是有很多……)

我的问题是,为什么我当前的代码无法将所有数据打印到新的文本文件中?我应该如何编写代码,使其不会先打印整个内容,然后再将其导入新文件?如何将其自动导入新文本文件


任何帮助都将不胜感激!谢谢大家!

为避免打印结果,请对打印功能进行注释:

#print(results)
然后,写入文件的代码片段出现问题:

for list in results:
    dataFile.writelines(results)
writelines()需要一个字符串列表,您不必自己迭代字符串列表(结果)

使用write()并迭代:

for line in results:
    dataFile.write(line)
或正确使用writelines:

dataFile.writelines(results)

您在for循环中不断重新分配
结果
,因此在您开始编写文件时,它只包含最后一位数据。您可能希望将结果创建为一个列表,并在运行时附加数据

fname="gencode.v19.annotation.gtf"

results = []
for line in open(fname,'r'):
    if not line.startswith('##'):
        col1=line.split()[0]
        col3=line.split()[2]
        col4=line.split()[3]
        col5=line.split()[4]
        if "protein_coding" in line and col3=="exon":
            data = col1,col4,col5
            results.append(data)
            print(data)

with open('results.txt','w') as datafile:
    for data in results:
        dataFile.write(str(data)) # Fix this: I dont know what formatting you want
或者,在for循环中写入:

fname="gencode.v19.annotation.gtf"
with open('results.txt','w') as datafile:

    results = []
    for line in open(fname,'r'):
        if not line.startswith('##'):
            col1=line.split()[0]
            col3=line.split()[2]
            col4=line.split()[3]
            col5=line.split()[4]
            if "protein_coding" in line and col3=="exon":
                data = col1,col4,col5
                dataFile.write(str(data)) # Fix this: I dont know what formatting you want
                print(data)

代码现在只向
结果
写出最后一个赋值。您需要在循环的每次迭代中写入(或附加)到输出文件。或者,您可以通过初始化空数组来分离代码的读写部分,以通过for循环存储所有
结果

还有几点建议:

a) 避免使用变量名
list
,因为在Python中这是一个受保护的词

b) 使用
with
语法打开文件,因为这样会在文件使用结束时自动关闭文件

c) 我将
拆分
行一次,然后在一行中分配变量名

with open('./results.txt', 'w') as outfile:
   with open('./gencode.v19.annotation.gtf', 'r') as infile:
       for line in infile:
           col1, col2, col3, col4, col5 = line.split()
           if 'protein_coding' in line and col3=='exon':
                outfile.write(','.join([col1, col4, col5]))

谢谢,但是没有任何数据被写入我的新文件,所以我不知道代码还有什么问题。非常感谢。这已经奏效了!谢谢x10000