简体   繁体   中英

how to replace the values of a dict in a txt file in python

I have a text file something.txt holds data like :

sql_memory: 300
sql_hostname: server_name 
sql_datadir: DEFAULT

i have a dict parameter={"sql_memory":"900", "sql_hostname":"1234" } I need to replace the values of paramter dict into the txt file , if parameters keys are not matching from keys in txt file then values in txt should left as it is . For example, sql_datadir is not there in parameter dict . so, no change for the value in txt file. Here is what I have tried :

import json
def create_json_file():
    with open(something.txt_path, 'r') as meta_data:
        lines = meta_data.read().splitlines()
    lines_key_value = [line.split(':') for line in lines]
    final_dict = {}
    for lines in lines_key_value:
        final_dict[lines[0]] = lines[1]

    with open(json_file_path, 'w') as foo:
        json.dumps(final_dict,foo, indent=4)

def generate_server_file(parameters):
    create_json_file()
    with open(json_file_path, 'r') as foo:
        server_json_data = json.load(foo)
    for keys in parameters:
        if keys not in server_json_data:
           raise KeyError("Cannot find keys")
    # Need to update the paramter in json file
    # and convert json file into txt again

x={"sql_memory":"900", "sql_hostname":"1234" }
generate_server_file(x)

Is there a way I can do this without converting the txt file into a JSON ? Expected output file(something.txt) :

sql_memory: 900
sql_hostname: 1234
sql_datadir: DEFAULT

Using Python 3.6

If you want to import data from a text file use numpy.genfromtxt .

My Code:

import numpy
data = numpy.genfromtxt("something.txt", dtype='str', delimiter=';')
print(data)

something.txt:

Name;Jeff
Age;12

My Output:

[['Name' 'Jeff']
 ['Age' '12']]

It`s very useful and I use it all of the time.

If your full example is using Python dict literals, a way to do this would be to implement a serializer and a deserializer. Since yours closely follows object literal syntax, you could try using ast.literal_eval , which safely parses a literal from a string. Notice, it will not handle variable names.

import ast

def split_assignment(string):
    '''Split on a variable assignment, only splitting on the first =.'''
    return string.split('=', 1)

def deserialize_collection(string):
    '''Deserialize the collection to a key as a string, and a value as a dict.'''

    key, value = split_assignment(string)
    return key, ast.literal_eval(value)

def dict_doublequote(dictionary):
    '''Print dictionary using double quotes.'''

    pairs = [f'"{k}": "{v}"' for k, v in dictionary.items()]
    return f'{{{", ".join(pairs)}}}'

def serialize_collection(key, value):
    '''Serialize the collection to a string'''
    return f'{key}={dict_doublequote(value)}'

And example using the data above produces:

>>> data = 'parameter={"sql_memory":"900", "sql_hostname":"1234" }'
>>> key, value = deserialize_collection(data)
>>> key, value
('parameter', {'sql_memory': '900', 'sql_hostname': '1234'})
>>> serialize_collection(key, value)
'parameter={"sql_memory": "900", "sql_hostname": "1234"}'

Please note you'll probably want to use JSON.dumps rather than the hack I implemented to serialize the value, since it may incorrectly quote some complicated values. If single quotes are fine, a much more preferable solution would be:

def serialize_collection(key, value):
    '''Serialize the collection to a string'''
    return f'{key}={str(value)}'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM