使用pickle.dump保存对象数组转为二进制,如何保存原格式?
解决方案
pickle是Python专用的二进制序列化工具,生成的文件本来就是不可读的二进制格式,不符合你需要的可读文本要求。好在你的Rule类已经实现了__repr__方法,它返回的字符串正好是你想要的格式,我们可以直接利用这个方法来生成目标文本。
方法1:保存为Rule对象列表元素形式
修改你的保存函数,直接将每个Rule对象转为字符串后写入文件:
def saveResponseInFile(rulesList): with open("Rules.txt", "w", encoding="utf-8") as file: # 用逗号+换行分隔每个Rule的字符串表示 file.write(",\n".join(repr(rule) for rule in rulesList))
生成的文件内容会和你期望的第一种格式一致:
Rule(F1, HTTPS TCP, ['currentIP', 'ip'], ['www.google.ca', '8.8.8.8'], 443), Rule(F4, HTTPS TCP, ['172.22.126.39', '172.23.94.9'], ['https://stackoverflow.com'], 443)
方法2:保存为带变量名的完整列表形式
如果需要生成包含myArray = [...]的格式,修改保存函数如下:
def saveResponseInFile(rulesList): with open("Rules.txt", "w", encoding="utf-8") as file: file.write("myArray = [\n") # 每个Rule占一行,用逗号分隔 file.write(",\n".join(repr(rule) for rule in rulesList)) file.write("\n]")
生成的文件内容会和你期望的第二种格式一致。
另一个脚本读取文件的方式
如果用方法2生成文件,另一个脚本可以通过exec直接加载内容(注意:仅当文件来源可信时使用,避免安全风险):
# 另一个脚本中的读取代码 with open("Rules.txt", encoding="utf-8") as file: content = file.read() exec(content) # 此时myArray变量已被定义,直接使用即可 print(myArray)
如果用方法1生成文件,可以读取后手动解析成列表:
# 另一个脚本中的读取代码 from your_module import Rule # 导入Rule类 rules = [] with open("Rules.txt", encoding="utf-8") as file: lines = file.read().split(",\n") for line in lines: if line.strip(): # 用eval将字符串转为Rule对象,同样需确保文件可信 rule = eval(line.strip()) rules.append(rule)
内容的提问来源于stack exchange,提问作者ritvik seth
相关产品推荐
相关产品推荐

