Search code examples
python-3.xpippackageconfigparser

Using ini file with password having special characters using python configparser


new.ini file

[main]
user_name = username
password = [k!:SU`T&m5@3D\\7Z

python code

from configparser import ConfigParser
config = ConfigParser()
config.read(CONFIG.ini file path)
print(config["main"]["user_name"])
print(config["main"]["password"])

output:

username
[k!:SU`T&m5@3D\\\\7Z

After reading the file, the parsed password is not same as file input password.


Solution

  • The password is still the same, but its representation is confusing you. The problem is the "\7" which could be interpreted as a special character. To avoid any confusion, python writes a double backslash. To see the difference, you may write the following two strings:

    string_1 = "\7"
    string_2 = r"\7"
    print(string_1)
    print(string_2)
    
    print(repr(string_1))
    print(repr(string_2))
    

    I hope this helps you to understand the difference in what python displays.

    Edit:

    There should not be an extra backlash. Please try the following:

    import configparser
    
    content = r"""
    [main]
    user_name = username
    password = [k!:SU`T&m5@3D\\7Z
    """
    with open('test.ini', mode='w') as file:
        file.write(content)
    parser = configparser.ConfigParser()
    with open('test.ini', mode='r') as file:
        parser.read_file(file)
    assert parser['main']['password'] == r"[k!:SU`T&m5@3D\\7Z"
    

    Edit2: Please try the edited code. It should create your ini file and read in the correct password as tested with the assertion.

    Edit3: I just copy pasted your ini file and ran your lines and get the correct output without extra slashes:

    username
    [k!:SU`T&m5@3D\\7Z
    

    So could you please show the output of the following lines:

    import platform
    import sys
    
    print(sys.version)
    print(platform.platform())
    print(sys.getdefaultencoding())
    

    which in my case says:

    3.8.5 (default, Sep  4 2020, 07:30:14) 
    [GCC 7.3.0]
    Linux-4.12.14-lp151.28.91-default-x86_64-with-glibc2.10
    utf-8
    

    Sorry, I cannot help you further, because I cannot reproduce your error.