[英]How to fix (what I think is) an encoding issue when exporting python dictionary to .csv file using pandas DataFrame?
[英]How to fix python hardcoded dictionary encoding issue
错误:
pymysql.err.InternalError: (1366, "Incorrect string value: '\\xEF\\xBF\\xBD 20...' for column 'history' at row 1")
在尝试调整字典时,我收到了一些变化,总是在历史列中,唯一的变化是它告诉我的字符是问题。
我无法发布字典,因为该字典包含敏感信息,但是这是jist:
注意:在复制/粘贴到记事本7个小时后,我用它来去除重音,使用notepad ++对其进行编码,然后仅尝试以使其正确编码的方式处理数据。 我想我的确没有带重音符号的版本,现在只输出了此工具。
我在字典中看不到“ \\ xEF \\ xBF \\ xBD 20 ...”,只看到文字。 目前我什至看不到“ 20” ...这两个字符帮助我找到了先前的问题。
我可以显示的代码:
def insert_tables(cursor, assets_final, ips_final):
#Insert Asset data into asset table
field_names_dict = get_asset_field_names(assets_final)
sql_field_names = ",".join(field_names_dict.keys())
for key, row in assets_final.items():
insert_sql = 'INSERT INTO asset(' + sql_field_names + ') VALUES ("' + '","'.join(field_value.replace('"', "'") for field_value in list(row.values())) + '")'
print(insert_sql)
cursor.execute(insert_sql)
#Insert IP data into IP table
field_names_dict = get_ip_field_names(ips_final)
sql_field_names = ",".join(field_names_dict.keys())
for hostname_key, ip_dict in ips_final.items():
for ip_key, ip_row in ip_dict.items():
insert_sql = 'INSERT INTO ip(' + sql_field_names + ') VALUES ("' + '","'.join(field_value.replace('"', "'") for field_value in list(ip_row.values())) + '")'
print(insert_sql)
cursor.execute(insert_sql)
def output_sqlite_db(sqlite_file, assets_final, ips_final):
conn = sqlite3.connect(sqlite_file)
cursor = conn.cursor()
insert_tables(cursor, assets_final, ips_final)
conn.commit()
conn.close()
def output_mysql_db(assets_final, ips_final):
conn = mysql.connect(host=config.mysql_ip, port=config.mysql_port, user=config.mysql_user, password=config.mysql_password, charset="utf8mb4", use_unicode=True)
cursor = conn.cursor()
cursor.execute('USE ' + config.mysql_DB)
insert_tables(cursor, assets_final, ips_final)
conn.commit()
conn.close()
编辑:这可能与我使用Cygwin作为终端的事实有关吗? 哈! 我添加了这一行,并得到了不同的消息(现在再次使用带重音符号的版本):
cursor.execute('SET NAMES utf8')
错误:
pymysql.err.InternalError: (1366, "Incorrect string value: '\\xC5\\x81A II...' for column 'history' at row 1")
我可以对您提供的消息有所帮助:
情况1:
>>> import unicodedata as ucd
>>> s1 = b"\xEF\xBF\xBD"
>>> s1
b'\xef\xbf\xbd'
>>> u1 = s1.decode('utf8')
>>> u1
'\ufffd'
>>> ucd.name(u1)
'REPLACEMENT CHARACTER'
>>>
看起来您已获得一些以utf8以外的其他编码方式编码的字节(例如cp1252),然后尝试了bytes.decode(encoding='utf8', errors='strict')
。 这检测到一些错误。 然后,您再次使用error =“ replace”解码。 这没有例外。 但是,您的数据已用替换字符(U + FFFD)替换了错误字节。 然后,您使用str.encode
对数据进行str.encode
以便可以写入文件或数据库。 每个替换字符变为3个十六进制字节EF BF BD
。
...更多
情况2:
>>> s2 = b"\xC5\x81A II"
>>> s2
b'\xc5\x81A II'
>>> u2 = s2.decode('utf8')
>>> u2
'\u0141A II'
>>> ucd.name(u2[0])
'LATIN CAPITAL LETTER L WITH STROKE'
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.