首页 > 解决方案 > 循环遍历文件对python

问题描述

我有一个脚本,它接收两个文件作为输入并根据行创建一个字典。最后,它会覆盖第一个文件。

我正在寻找一种在文件夹的所有文件对上运行此脚本的方法,根据名称中的模式选择 sys.argv[1] 和 sys.argv[2]。

import re
import sys

datafile = sys.argv[1]
schemaseqs = sys.argv[2]

datafile_lines = []
d = {}
prev = None
with open(datafile, 'r') as f:
    i = 0
    for line in f:
        if i % 2 == 0:
            d[line.strip()]=0
            prev = line.strip()
        else:
            d[prev] = line.strip()
        i+=1

new_d = {}
with open(schemaseqs, 'r') as f:
    i=0
    prev = None
    for line in f:
        if i % 2 == 0:
            new_d[line.strip()]=0
            prev = line.strip()
        else:
            new_d[prev] = line.strip()
        i+=1

for key, value in d.items():
    if value in new_d:
        d[key] = new_d[value]

print(d)

with open(datafile,'w') as filee:
    for k,v in d.items():
        filee.writelines(k)
        filee.writelines('\n')
        filee.writelines(v)
        filee.writelines('\n')

我有数百个文件对都共享相同的模式 proteinXXXX(其中 XXXX 是一个数字) 这个数字最多可以有四位数字(例如 9,99,999 或 9999)。所以我有蛋白质 555.txt 和蛋白质 555.fasta

我已经看到我可以使用 glob 或 os.listdir 从目录中读取文件。但是,我不能将它们分配给变量并在目录的每一对中一次提取一对。

任何帮助表示赞赏。

标签: python

解决方案


只是概念。

导入所需的库。

import glob
import os.path

定义仅从文件名中提取基本名称(没有扩展名的部分)的函数。

def basename(fn):
    return os.path.splitext(os.path.basename(fn))[0]

创建两组,一组带有.txt文件,另一组带有.fasta文件。

t = {basename(fn) for fn in glob.glob("protein*.txt")}
f = {basename(fn) for fn in glob.glob("protein*.fasta")}

计算这两组的交集,以确保.txt.fasta文件都以相同的basename存在。然后添加缺少的后缀并让它们使用现有代码进行处理。

for bn in t.intersection(f):
    process(bn + ".txt", bn + ".fasta")

推荐阅读