Как изменить значения словаря в файле python из другого файла - PullRequest
1 голос
/ 13 марта 2020

Я хотел бы изменить значения в Dict в другом файле. File1.py содержит код для редактирования Dict, File2.py содержит сам Dict.

File1.py генерирует код для замены только BTOK значений.

File1.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)

File2.py:

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

1 Ответ

0 голосов
/ 13 марта 2020

Если вы хотите сделать это надежно, то есть, чтобы оно работало независимо от того, заключены ли в кавычки ваши строки с ', " или """, для любых значений, которые они имеют, и для любых строк, которые вы хотите поместить вокруг значений, тогда вы можете использовать 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'}
...