python - 循环遍历文件对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 从目录中读取文件。但是,我不能将它们分配给变量并在目录的每一对中一次提取一对。
任何帮助表示赞赏。
解决方案
只是概念。
导入所需的库。
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")
推荐阅读
- javascript - Laravel & JQuery : 获取可拖放图像中可拖动对象的正确位置
- python - 有没有办法可以将 2 个列表和一个数组组合成一个多字典?
- kubernetes - 如何设置 KUBECONFIG 从 github 操作部署连接到 Azure Kubernetes 服务?
- python - Python3 - 从多个文件计算并保存到新文件
- python - Python二进制和常规字符串混淆
- flutter - Flutter:FormBuilderDropdown 自动完成
- reactjs - 我可以让我的 React 项目完全离线工作吗?
- python - 执行长函数时如何使 Tkinter GUI 不崩溃?
- python-3.x - Telethon:有没有办法更快地从频道下载消息?
- python - 在 Pandas 中对分组数据进行排序