繁体   English   中英

如何解决python硬编码字典编码问题

[英]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:

  • 我从200个地址(包括状态,邮政编码等)开始,这些地址需要经过验证,规范化和标准化才能插入数据库。
  • 我花了大量时间在Google地图上进行验证和标准化。
  • 我决定看上一遍,然后将所有疯狂的带有重音符号的字母放到这些世界地址的地址中(通常是从Google抄袭过来的,因为我不知道如何键入和A并带有O,大声笑),新加坡到巴西,到处都是。
  • 经过处理,我在词典中得到了120个唯一地址。
  • 在SQLite中插入数据并输出到CSV时,一切都可以100%完美地工作。 这个问题只与MySQL和一些偷偷摸摸的看不见的字符有关。

注意:在复制/粘贴到记事本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.

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