我正在从一个大的.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 ......)
我的问题是,为什么我当前的代码无法将所有数据打印到新的文本文件中?我应该如何编写代码,使其不首先打印整个代码,然后将其导入新文件?如何将其自动导入新文本文件?
任何帮助都会非常感激!谢谢!
答案 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]))