我正在尝试从字典中将值(列表)打印到包含第一列中的字典键的另一个文件的第三列。我希望在输出文件的第三列中打印值列表,并用空格分隔每个值。我知道我的问题在于某些事实,即Python不能写出不是字符串的东西,并且列表被“,”分隔,但我是编程的新手,不知道如何实现这一点 - 任何帮助都是非常感谢,谢谢!
GtfFile.txt是一个10列文件(sep ='\ t'),我从...生成字典,使用基因名称作为关键字,术语(功能类别)作为值。一些基因有一个以上的术语归因于它们,并且作为每个术语的新线重复。每个术语也有不同数量的基因,因此我生成一个列表作为每个术语的关键。我的脚本的这一部分似乎正在工作,因为我会喜欢它!
FuncEnr_terms.txt是一个2列文件(sep ='\ t'),它由第一列中的Term和第2列中的术语描述组成。我想要的输出文件是使用第三列复制此文件,该列包含与空格分隔的术语相关联的基因。将这些写入输出文件是我的问题所在。
以下是我的代码:
#!/usr/bin/env python
import sys
from collections import defaultdict
if len(sys.argv) != 4 :
print("Usage: GeneSetFileGen.py <GtfFile.txt> <FuncEnr_terms.txt> <OutputFile.txt>")
sys.exit(0)
OutFileName = sys.argv[3]
OutFile = open(OutFileName, 'w')
TermGeneDic = defaultdict(list)
with open(sys.argv[1], 'r') as f :
for line in f :
line = line.strip()
line = line.split('\t')
Term = line[8]
Gene = line[0]
TermGeneDic[Term].append(Gene)
#write output file
with open(sys.argv[2], 'r') as f :
for line in f :
line = line.strip()
Term, Des = line.split('\t')
OutFile.write(Term + '\t' + Des + '\t' + str(TermGeneDic[Term]) + '\n')
OutFile.close
答案 0 :(得分:2)
如果我理解你的要求,那么你需要的是替换这个表达式:
str(TermGeneDic[Term])
有类似的东西:
" ".join(TermGeneDic[Term])
答案 1 :(得分:1)
关于代码的几点建议:如果您没有非常密切地遵循pep 8约定,那么对于其他人来说,您的代码将难以理解。这意味着除了类名之外没有CamelCase。
其次,重用变量通常很糟糕,并且表明你应该将这些方法调用链接起来。如果你有一个像line
这样的变量,你真正改变了它的类型,那就特别糟糕了。
第三,括号(括号)对于调用方法或函数是必需的。
第四,将列表元素加入到'\t'.join(termgenes[term])
最后,使用模板生成长字符串 - 最终更容易使用。
您的代码应如下所示:
import sys
from collections import defaultdict
if len(sys.argv) != 4 :
print("Usage: GeneSetFileGen.py <GtfFile.txt> <FuncEnr_terms.txt> <OutputFile.txt>")
sys.exit(0)
progname,gtffilename,funcencrfilename,outfilename = sys.argv
termgenes = defaultdict(list)
with open(gtffilename, 'r') as gtf :
for line in gtf:
linefields = line.strip().split('\t')
term, gene = linefields[8],linefields[0]
termgenes[term].append(gene)
#write output file
with open(funcencrfilename, 'r') as funcencrfile, open(outfilename, 'w') as outfile:
for line in funcencrfile:
term, des = line.strip().split('\t')
outfile.write('%s\t%s%s\n' % term,des,'\t'.join(termgenes[term]))