我正在编写一个python脚本,用特定的扩展名(.seq)替换目录中每个文本文件的字符串。替换的字符串应该只来自每个文件的第二行,并且输出是一个新的子目录(称为clean),其文件名与原始文件相同,但后缀为*.clean。输出文件包含与原始文件完全相同的文本,但替换了字符串。我需要将所有这些字符串:“K”、“Y”、“W”、“M”、“R”、“S”替换为“N”。
这就是我在谷歌搜索后想到的。这是非常混乱(第二周的编程),它停止复制文件到干净的目录,而不替换任何东西。我非常感谢你的帮助。
谢谢你!
import os, shutil
os.mkdir('clean')
for file in os.listdir(os.getcwd()):
if file.find('.seq') != -1:
shutil.copy(file, 'clean')
os.chdir('clean')
for subdir, dirs, files in os.walk(os.getcwd()):
for file in files:
f = open(file, 'r')
for line in f.read():
if line.__contains__('>'): #indicator for the first line. the first line always starts with '>'. It's a FASTA file, if you've worked with dna/protein before.
pass
else:
line.replace('M', 'N')
line.replace('K', 'N')
line.replace('Y', 'N')
line.replace('W', 'N')
line.replace('R', 'N')
line.replace('S', 'N')
一些注释:
string.replace
和re.sub
不在适当的位置,因此应该将返回值重新分配给变量。glob.glob
更适合在目录中查找与定义的模式匹配的文件。。。with
语句负责以安全的方式关闭文件。如果您不想使用它,您必须使用try
finally
。*.clean
;)fileinput
模块(直到今天我才知道)我举个例子:
希望有帮助。
以下是一些一般提示:
不要使用
find
检查文件扩展名(例如,这也将匹配“file1.seqdata.xls
”)。至少使用file.endswith('seq')
,或者更好的是,os.path.splitext(file)[1]
实际上,不要完全那样做。这就是你想要的:
不要复制文件,只使用一个循环更容易:
不要使用
line.__contains__('>')
。你的意思是(将在内部调用
__contains__
)。但实际上,您想知道行是否以“>;”开头,而不是行内某个地方是否有行,无论它是否在开头。所以最好的办法是:我不熟悉您的文件类型;如果
">"
检查真的只是为了确定第一行,那么有更好的方法可以做到这一点。你不需要
if
块(你只需要pass
)。写起来更干净而不是
学Python玩得开心!
您应该用
line=line.replace('M', 'N')
替换line.replace('M', 'N')
。replace返回替换了相关子字符串的原始字符串的副本。一个更好的方法(IMO)是使用re。
相关问题 更多 >
编程相关推荐