所有!
新手在这里!我试图创建一个允许我替换四个字符(ACTG)的函数。为了更简洁,我想取代' A'用' T'和' C'与' G',反之亦然。
到目前为止我的代码是这样的,但是我得到了一个错误(翻译期望至少有1个参数,得到0)。
#!/usr/bin/python
from sys import argv
from os.path import exists
def translate():
str.replace("A", "T");
str.replace("C", "G");
str.replace("G", "C");
str.replace("T", "A");
script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)
in_file = open(from_file)
indata = in_file.read()
newdata = indata.translate()
out_file = open(to_file, 'w')
out_file.write(newdata[::-1])
out_file.close()
in_file.close()
我尝试给翻译函数一个参数(def translate(str)
)并用str(newdata = indata.translate(str)
)调用它,但那些也没有用。
感谢任何帮助和指导。
答案 0 :(得分:5)
使用翻译表:
import string
table = string.maketrans('ACGT', 'TGCA')
您可以像这样应用转换:
with open(from_file) as f:
contents = f.read()
contents = contents.translate(table) # Swap A<->T and C<->G
contents = contents[::-1] # Reverse the string
with open(to_file, 'w') as f:
f.write(contents)
答案 1 :(得分:2)
您创建了一个函数,而不是方法。它确实需要一个参数,但你需要将你的字符串作为参数传递给函数:
def translate(s):
s = s.replace("A", "T")
s = s.replace("C", "G")
s = s.replace("G", "C")
s = s.replace("T", "A")
return s
然后,您需要致电translate(indata)
,而不是indata.translate()
。
请注意我做的其他一些更改:
s
而不是str
,因为str
已经是内置类型的名称。replace
的结果分配给变量。 replace
返回 new 字符串,替换完成。它不会修改原始字符串。但是,您的功能仍然无效,因为替换相互补充。用T替换A后,用A替换T,因此将更改为Ts,然后再返回到As。您应该尝试修复此功能,但这个答案可以帮助您解决一些问题。
答案 2 :(得分:1)
实际上translate()
模块中内置了一个string
函数,它基本上可以满足您的需求。
http://www.tutorialspoint.com/python/string_translate.htm
尝试这样的事情:
import string
intable = "ACGT"
outtable = "TGCA"
translator = maketrans(intable, outtable)
str = str.translate(translator)
这将正确地进行角色交换。