【问题标题】:How to Change dictionary values in python file from another file如何从另一个文件更改python文件中的字典值
【发布时间】:2020-03-13 14:43:01
【问题描述】:

我想在另一个文件中更改字典中的值。 File1.py 包含编辑字典的代码,File2.py 包含字典本身。

File1.py 正在生成代码以仅替换 BTOK 值。

文件1.py:

with open('file2.py', 'r') as file :
    filedata = file.read()
    print (filedata.str(BTK['btk1']))
    for line in filedata:
        line['btk1'] = BTok
with open('file2.py', 'w') as file:
    file.write(line)

文件2.py:

c = {
    'id' : 'C80e3ce43c3ea3e8d1511ec',
    'secret' : 'c10c371b4641010a750073925b0857'
}
rk = {
    't1' : 'ZTkwMGE1MGEt',
}
BTK = {
    'BTok' : '11eyJhbGc'
}

【问题讨论】:

  • 问题不清楚,能否详细说明?想要将 11eyJhbGc 替换为 file2.py 中的其他值吗?
  • 抱歉,我只想在 file2 中替换 BTok 的值。所以我的 file1 我有一些代码可以生成一个新密钥,然后我想在 BTOK 密钥下替换 file2 中的那个密钥

标签: python python-3.x python-3.7


【解决方案1】:

如果您想可靠地执行此操作,也就是说,无论您的字符串是否用'"""" 引用,对于它们具有的任何值以及您想要在值周围放置的任何换行符,它都有效,那么您可能想使用ast 来解析源代码并对其进行修改。唯一不方便的是模块本身不能生成代码,因此您需要安装一些额外的依赖项,例如astor,这实际上是一项相当琐碎的任务。无论如何,您可以这样做:

import ast
import astor

# To read from file:
# with open('file2.py', 'r') as f: code = f.read()
code = """
c = {
    'id' : 'C80e3ce43c3ea3e8d1511ec',
    'secret' : 'c10c371b4641010a750073925b0857'
}
rk = {
    't1' : 'ZTkwMGE1MGEt',
}
BTK = {
    'BTok' : '11eyJhbGc'
}
"""

# Value to replace
KEY = 'BTok'
NEW_VALUE = 'new_btok'
# Parse code
m = ast.parse(code)
# Go through module statements
for stmt in m.body:
    # Only look at assignments
    if not isinstance(stmt, ast.Assign): continue
    # Take right-hand side of the assignment
    value = stmt.value
    # Only look at dict values
    if not isinstance(value, ast.Dict): continue
    # Look for keys that match what we are looking for
    replace_idx = [i for i, k in enumerate(value.keys)
                   if isinstance(k, ast.Str) and k.s == KEY]
    # Replace corresponding values
    for i in replace_idx:
        value.values[i] = ast.Str(NEW_VALUE)

new_code = astor.to_source(m)
# To write to file:
# with open(`file2.py', 'w') as f: f.write(new_code)
print(new_code)
# c = {'id': 'C80e3ce43c3ea3e8d1511ec', 'secret':
#     'c10c371b4641010a750073925b0857'}
# rk = {'t1': 'ZTkwMGE1MGEt'}
# BTK = {'BTok': 'new_btok'}

【讨论】:

  • 但我正在尝试更改 BTok1 的值(在我的其他脚本中我已经更改了值) BTK = { 'BTok' : '11eyJhbGc' }
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多