首页
社区
课程
招聘
[原创]python 动态生成变量及给变量赋值
2023-6-14 17:04 19631

[原创]python 动态生成变量及给变量赋值

2023-6-14 17:04
19631

0x01 需求

在工作中遇到这么一个情况,在某个文件夹下有很多文件,还有可能在文件夹下还有文件夹;
文件夹下的文件内容是从数据库中导出的,具有特定的格式;
我需要将这个目录下的所有文件进行读取;
变量类型需要两种,list和dict;
变量名就是文件名,变量需要赋值的内容就是文件内容。

0x02 旧实现

在没想到通过动态生成变量名及动态给变量赋值时,实现方式:

1
2
3
4
5
6
7
8
9
10
name_list = []
with open(r'path', 'r', encoding='UTF-8') as f:
    name_mes = f.read()
    name_mes = name_mes.split('\n')
    for key_mess in name_mes[:]:
        if key_mess != '':
            key_mes = key_mess.split('\t')
            index_mes = key_mes[2]
            name_list.append(index_mes)
self.name_dict = dict(zip(name_list, name_mes))

一个文件就需要一个实现,经常几千上万个文件,想想这个代码量,恐怖!!!

0x03 动态生成

目的动态生成了变量、读取文本文件、处理文件内容并生成字典。
通过下述代码,可以将指定文件夹中的多个文本文件转换为字典形式的数据存储。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
self._path = path # 要处理的文本文件所在的文件夹路径
# 多级文件夹用 通过递归遍历文件夹,找到所有扩展名为 .txt 的文件,并将它们的完整路径存储在 file_names 列表中
file_names = [os.path.join(root, file) for root, dirs, files in os.walk(self._path) for file in files if os.path.splitext(file)[1] == ".txt"]
 
# 单层文件夹用
# file_names = [f for f in os.listdir(self._path) if f.endswith('.txt')]
for file_path in file_names:
    # 文件路径中提取文件名,并将路径中的目录部分替换为空字符串,然后将剩余的反斜杠字符 \ 替换为下划线 _,得到一个清理后的文件名
    file_name = file_path.replace(self._path, '').replace('\\', '_')
    # 获取文件名(去除扩展名)作为变量名的一部分。
    var_value = os.path.splitext(file_name)[0
    # 构造一个以 self. 开头、去除扩展名后面加上 _list 结尾的字符串作为变量名
    var_key = 'self.' + os.path.splitext(file_name)[0] + '_list'
    # 构造一个以 self. 开头、去除扩展名后面加上 _dict 结尾的字符串作为变量名
    var_dict = 'self.' + os.path.splitext(file_name)[0] + '_dict'
    # 使用 exec 函数动态生成同名变量的空列表,并将变量名设置为 var_value 对应的值。 
    exec(f'{var_value}=[]')
    # 同样使用 exec 函数动态生成同名变量的空列表和空字典。
    exec(f'{var_key}=[]'
    exec(f'{var_dict}={{}}'
    with open(file_path, 'r', encoding='utf-8') as f:
        txt_content = f.read()
        # 使用 exec 函数将文件内容按双换行符分割,并赋值给变量名为 var_value 对应的变量。
        exec(f"{var_value} = txt_content.split('\\n\\n')")
    for item in eval(var_value):
        if item != '':
            key_mes = item.split('\t')
            index_mes = key_mes[0]
            exec(f"{var_key}.append(index_mes)")
    # 使用 exec 函数构建字典,将键(从 eval(var_key) 获取)和值(从 eval(var_value) 获取)通过 zip 函数进行配对,并将配对后的结果存储在与 var_dict 字符串对应的变量中。最终生成的字典存储了文件中的数据,其中键是索引(index_mes),值是文件中的内容。
    exec(f"{var_dict} = dict(zip(eval(var_key), eval(var_value)))")

实践读数据库表也可以这么操作,省时省力,灰常好用!


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2023-6-14 17:07 被行简编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (7)
雪    币: 92
活跃值: (209)
能力值: ( LV6,RANK:95 )
在线值:
发帖
回帖
粉丝
谢逅 2 2023-7-6 11:45
2
0
依靠变量名来做事情的 代码是谁写的。。用你的数据的后面那部分代码的设计者我真的是感到哈哈哈
雪    币: 2671
活跃值: (3839)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
行简 2023-7-6 14:18
3
0
谢逅 依靠变量名来做事情的 代码是谁写的。。用你的数据的后面那部分代码的设计者我真的是感到哈哈哈
动态生成,运行阶段才会分配,后来者看不懂说明还得继续深造,hhhh
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_水山 2023-7-7 18:11
4
0
没看懂你的需求,但是我觉得你实现的很麻烦  你能详细说下你的需求吗?我目前理解到就是,你读取了嵌套文件夹里面的文本文件到内存。然后呢,跟动态生成变量有什么关系哎
雪    币: 2671
活跃值: (3839)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
行简 2023-7-9 20:35
5
0
wx_水山 没看懂你的需求,但是我觉得你实现的很麻烦 你能详细说下你的需求吗?我目前理解到就是,你读取了嵌套文件夹里面的文本文件到内存。然后呢,跟动态生成变量有什么关系哎
比如你有一万个文件,每一个文件里面的内容都需要读入内存,需求就是文件名为变量名,文件中的内容为变量的值,且需要用到时进行内容读取
雪    币: 19485
活跃值: (29158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-7-9 23:48
6
1
感谢分享
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_水山 2023-7-10 14:53
7
0
行简 比如你有一万个文件,每一个文件里面的内容都需要读入内存,需求就是文件名为变量名,文件中的内容为变量的值,且需要用到时进行内容读取
感觉是需求不太合理,怎么会有人要求 文件名为变量名呢,搞个字典不也是一样引用吗
雪    币: 2671
活跃值: (3839)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
行简 2023-7-10 18:42
8
0
wx_水山 感觉是需求不太合理,怎么会有人要求 文件名为变量名呢,搞个字典不也是一样引用吗
不合理的需求天天有,数据库表也可一样应用。
游客
登录 | 注册 方可回帖
返回