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

时间:2014-07-28 16:52:13

标签: 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]
        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()

在IDLE打印出的结果如下所示:

['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']

(但是有一些TON ......)

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

任何帮助都会非常感激!谢谢!

3 个答案:

答案 0 :(得分:1)

您继续在for循环中重新分配results,以便在您编写文件时只有最后一位数据。您可能希望将结果创建为列表并随时附加数据。

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)

答案 1 :(得分:0)

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

#print(results)

然后,您的“写入文件”代码段存在问题:

for list in results:
    dataFile.writelines(results)

writelines()需要一个字符串列表,您不必自己迭代字符串(结果)列表。

使用write()AND迭代:

for line in results:
    dataFile.write(line)

或正确使用writelines:

dataFile.writelines(results)

答案 2 :(得分:0)

现在代码只写出results的最后一个分配。您需要通过循环的每次迭代来编写(或追加)输出文件。或者,您可以通过初始化空数组以通过for循环存储所有results来分隔代码的读取和写入部分。

更多建议:

a)避免使用变量名list,因为它是Python中受保护的单词。

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

c)我会split一行,然后在一行中指定变量名。

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]))