我正在编写一个重命名文件(几种不同的格式)的代码,所有类型为000_PROTEINNAME_....目标是用其各自的基因名称替换蛋白质名称。
我已经将这两个值保存在字典中,其中蛋白质名称作为键,基因名称作为值(名称本身被提取到包含此信息的tsv文件的两列列表中,然后我使用列表来制作字典).我目前正在运行此程序,尽管它可以工作,这个文件夹包含了4000个文件,运行时间太长了。2你有什么建议可以减少这个文件夹的运行时间吗?
def RenameAlphaFold(files_path, reference_table_path):
with open(reference_table_path) as names:
TSV_table = csv.reader(names, delimiter= '\t')
original_names = []
new_names = []
for line in TSV_table:
original_names.append(line[2])
new_names.append(line[5])
names = dict(zip(original_names, new_names))
for old, new in names.items():
for file in os.listdir(files_path):
destination = file.replace(old, new)
source = files_path + '\\' + file
destination = files_path + '\\' + destination
os.rename(source, destination)
2条答案
按热度按时间rkue9o1l1#
我 * 认为 * 您运行
os.rename
的次数过多看起来你是在为
files_path
中的 * 每一个 * 文件运行这个,不管它是否需要重命名,* 为每一个替换组合 *。快速修复
改变这个
到这个
可能更优雅的修复
我不知道这是否可行,但如果可行的话,它将是优雅的。
首先循环遍历文件,然后替换 * 字符串 *,但每个文件只重命名一次。
子串问题?
ukxgm1gy2#
你有两个循环,一个在字典上,另一个在文件夹上。目前,你迭代一次字典,但在文件夹上迭代多次(在tsv文件中每行一次),而磁盘访问已知要比内存访问慢得多。你至少应该反转你的循环:
另一个(不太重要的)可能的改进是,如果你可以很容易地从文件名中提取蛋白质名称,即如果它们有一个简单而常见的模式,那么可以访问每个键的字典。如果没有意义,不要费心构建字典,直接构建一个对列表:
至少,这比你原来的代码更简单,所以更容易输入和维护。。