首页 > 解决方案 > Python如何从excel电子表格中正确定位熊猫字典

问题描述

我正在尝试使用 Pandas 构建一个模拟数据库来处理输入新的用户名、盐和哈希。首先,我创建了一个空白字典。

users ={}

然后我得到用户的输入并将其添加回字典。

def add_user():
    username = input("Create a Username: ") # The users username
    password1 = input("Create a new password: ")
    password2 = input("Re-enter your password: ") # The users password
    if password1 == password2:
        salt = os.urandom(32) # A new salt for this user
        key = hashlib.pbkdf2_hmac('sha256', password1.encode('utf-8'), salt, 100000)
        users[username] = { # Store the salt and key
                            'salt': salt,
                            'key': key
                            }
        print(users)
        df = pd.DataFrame.from_dict(users)
        df.to_excel("User_Database.xlsx", index = False)
        
    else:
        print("Your passwords do not match, try again.")
        add_user()

如果我只是打印“用户”字典,它会很好。我得到:

{'Rocketman': {'salt': b';\x97\xe8\xcc6A\xbf\xe4Z\x9e\xa7\xf9+\xbas\xa3\x17\x01$Z1\xfb\xa2G\x03u\xd2\xa1\xd5\x8e:0', 'key': b'\xb6\xdec\xa0\t\x10\x02j\x12O^\xa2w\xbf)bz\x10vk\xe4\xe6\xa5op\x95\x06\xc6<\xe9\x8b\x8b'}}

如果我多次运行该函数,我会得到:

{'rocketman 1': {'salt': b'X\x026N\xb2P\xb3\xd1m\xb1\xc1\xf0\xcc\x9b\x88\xb4\xf8\x95W~\xd1\xd7\x0c\x88\xed\xc6mdc|\xc7\xf9', 'key': b'\xfc\xa2\x0c=\xada\x81\xf0\x05\x1d?\x95\x14*\xf4_\xf2\xb2R\x19:\x94c\xd6\xa5C\xdc:B}\xf0\xc3'}, 'rocket man 2': {'salt': b't/\xab\x01l\xa1\xe0\xba\xb6\xa6\xc6\xd4\x01\x1d/\xf2\x86h\xf4x-=r\x97\r\xe6X|\xa3\x04b\xc9', 'key': b'\xdb\xf4y\x03#\x9e\xff*<\xbcYi\t\xb9\xa78\x0fF\xfc\xc0\xe6\x9e&\xf0x\x8c\xd3\xec\x0b\x01w\x9a'}}

但是,我想阅读这个 excel 电子表格,将其转换为字典,并在创建时添加更多用户。

users = pd.read_excel('User_Database.xlsx')
users = users.to_dict()
users

但是,当我阅读电子表格并将其制成字典时,问题就出现了。格式更改为:

{'Unnamed: 0': {0: 'salt', 1: 'key'},
 'rocketman 1': {0: "b'X\\x026N\\xb2P\\xb3\\xd1m\\xb1\\xc1\\xf0\\xcc\\x9b\\x88\\xb4\\xf8\\x95W~\\xd1\\xd7\\x0c\\x88\\xed\\xc6mdc|\\xc7\\xf9'",
  1: "b'\\xfc\\xa2\\x0c=\\xada\\x81\\xf0\\x05\\x1d?\\x95\\x14*\\xf4_\\xf2\\xb2R\\x19:\\x94c\\xd6\\xa5C\\xdc:B}\\xf0\\xc3'"},
 'rocket man 2': {0: "b't/\\xab\\x01l\\xa1\\xe0\\xba\\xb6\\xa6\\xc6\\xd4\\x01\\x1d/\\xf2\\x86h\\xf4x-=r\\x97\\r\\xe6X|\\xa3\\x04b\\xc9'",
  1: "b'\\xdb\\xf4y\\x03#\\x9e\\xff*<\\xbcYi\\t\\xb9\\xa78\\x0fF\\xfc\\xc0\\xe6\\x9e&\\xf0x\\x8c\\xd3\\xec\\x0b\\x01w\\x9a'"}}

或者,如果我只使用一个用户名,保存它,读取文件,然后重试 Pandas 添加正确的列,然后将新的盐和哈希放在电子表格的较低位置。

Name 1 | Name 2
b'X\\  | NaN
b'X\\  | NaN
NaN    | b'X\\
NaN    | b'X\\

我尝试将索引删除,但这并不能解决问题。我应该重塑我的字典吗?理想情况下,我希望工作表看起来像这样:

Data_Type | Name 1
Salt      | b'X\\
Hash      | b'X\\

标签: python-3.xexcelpandasdictionary

解决方案


您可能需要以下格式的字典:

{
   'users': ['rocketman', 'bucketman'],
   'salt': ['...123123....', '....245345345...'],
   'hash': ['...abcdf....', '....hijklm......']
}

然后,将其传递给 pandas 数据帧,这将按列写入 XLSX 文件,而不是当前格式 - Pandas 数据帧与列数据一起使用!


推荐阅读