UnicodeDecodeError:“ascii”编解码器无法解码位置 47 中的字节 0x92:序号不在范围内(128)

2023-12-12

我正在尝试使用 Python 在 StringIO 对象中写入数据,然后最终使用 psycopg2 的 copy_from() 函数将此数据加载到 postgres 数据库中。

首先,当我这样做时,copy_from()抛出错误:错误:编码“UTF8”的字节序列无效:0xc92所以我遵循这个问题.

我发现我的 Postgres 数据库有 UTF8 编码。

我正在写入数据的文件/StringIO 对象显示其编码如下: setgid 非 ISO 扩展 ASCII 英文文本,行很长,带有 CRLF 行终止符

我尝试将写入中间文件/StringIO 对象的每个字符串编码为 UTF8 格式。为此,对每个字符串使用 .encode(encoding='UTF-8',errors='strict')) 。

这是我现在得到的错误: UnicodeDecodeError:“ascii”编解码器无法解码位置 47 中的字节 0x92:序号不在范围内(128)

这是什么意思?我如何解决它?

编辑: 我正在使用Python 2.7 我的一些代码:

我从 MySQL 数据库读取数据,该数据库按照 MySQL Workbench 以 UTF-8 编码的数据。 这是几行代码,用于将我的数据(从 MySQL 数据库获取)写入 StringIO 对象:

# Populate the table_data variable with rows delimited by \n and columns delimited by \t
row_num=0
for row in cursor.fetchall() :

    # Separate rows in a table by new line delimiter
    if(row_num!=0):
        table_data.write("\n")

    col_num=0
    for cell in row:    
        # Separate cells in a row by tab delimiter
        if(col_num!=0):
            table_data.write("\t") 

        table_data.write(cell.encode(encoding='UTF-8',errors='strict'))
        col_num = col_num+1

    row_num = row_num+1   

这是从我的 StringIO 对象 table_data 写入 Postgres 数据库的代码:

cursor = db_connection.cursor()
cursor.copy_from(table_data, <postgres_table_name>)

问题是你正在打电话encode on a str object.

A str是一个字节字符串,通常表示以某种方式编码的文本,例如 UTF-8。你打电话时encode为此,首先必须将其解码回文本,以便可以对文本进行重新编码。默认情况下,Python 通过调用来做到这一点s.decode(sys.getgetdefaultencoding()), and getdefaultencoding()通常会返回'ascii'.

因此,您所说的是 UTF-8 编码的文本,将其解码为 ASCII,然后以 UTF-8 重新编码。

一般的解决方案是显式调用decode使用正确的编码,而不是让Python使用默认的编码,然后encode结果。

但是,当正确的编码已经是您想要的编码时,更简单的解决方案是跳过.decode('utf-8').encode('utf-8')只需使用 UTF-8str作为 UTF-8str已经是这样了。

或者,如果您的 MySQL 包装器具有允许您指定编码并返回的功能unicodeCHAR/VARCHAR/TEXT列而不是str值(例如,在 MySQLdb 中,您传递use_unicode=True to the connect致电,或charset='UTF-8'如果您的数据库太旧而无法自动检测),就这样做。然后你就会有unicode对象,你可以调用.encode('utf-8')在他们。

一般来说,处理 Unicode 问题的最佳方法是最后一种 - 尽早解码所有内容,以 Unicode 进行所有处理,然后尽可能晚地编码。但无论哪种方式,你都必须保持一致。不要打电话str在某件事上可能是unicode;不要连接str字面意思是unicode或将一个传递给它replace方法;任何时候你混合和匹配时,Python 都会使用你的默认编码为你隐式转换,这几乎不是你想要的。

附带说明一下,这是 Python 3.x 的 Unicode 更改所提供的众多帮助之一。第一的,str现在是 Unicode 文本,而不是编码字节。更重要的是,如果你have编码字节,例如,在bytes对象,调用encode会给你一个AttributeError而不是尝试静默解码以便重新编码。并且,类似地,尝试混合和匹配 Unicode 和字节会给你一个明显的结果TypeError,而不是在某些情况下成功的隐式转换,并给出有关您在其他情况下未要求的编码或解码的神秘消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UnicodeDecodeError:“ascii”编解码器无法解码位置 47 中的字节 0x92:序号不在范围内(128) 的相关文章

随机推荐

  • 高效批量更新rails数据库

    我正在尝试构建一个 rake 实用程序 它会经常更新我的数据库 这是我到目前为止的代码 namespace utils do utils update ip Downloads the file frim
  • .Net“任何框架”配置

    我用 C NET 2 0 构建了一个程序 该程序在框架 3 0 和 3 5 下也能很好地工作 但如果 NET Framework 4 0是唯一安装的框架 则它不起作用 需要用户安装2 0 我在google中找到了以下配置
  • 堆栈与堆属性的 QT 特定差异?

    通常 在编写 C 代码时 我会始终将对象保留为普通属性 从而利用 RAII 然而 在 QT 中 删除对象的责任可以由析构函数承担QObject 因此 假设我们定义了一些特定的小部件 那么我们有两种可能性 1 使用QT的系统 class Wi
  • 不允许从一个 Google 电子表格访问另一个 Google 电子表格

    我试图通过其他电子表格中的 onEdit 事件为我的 Google 电子表格设置新值 我收到异常 不允许执行操作 我不明白我到底做错了什么 我会很高兴得到你的帮助 因为我只是在 JS Google Docs 脚本中做第一步 function
  • 将函数与 numpy 数组的每个元素积分作为积分极限

    我在 python 中有一个函数 也使用 scipy 和 numpy 定义为 import numpy as np from scipy import integrate LCDMf lambda x 1 0 np sqrt 0 3 1 x
  • 尝试使用 groupby 查找每月 5 个最大值

    我试图显示前三个值nc type每个月 我尝试使用n largest但这并没有按日期完成 原始数据 area nc type occurred date 0 Filling x 12 23 2015 0 00 1 Filling f 12
  • ddply+summary函数列名输入

    我正在尝试使用ddply and summarise一起从plyr包 但在解析不断变化的列名时遇到困难 在我的示例中 我想要一些能够以编程方式在 X1 中解析的东西 而不是在 X1 中硬编码到 ddply 函数中 举例说明 require
  • Android - 无法隐藏进度条

    因此 我检查了其他问题以隐藏进度条 但所有问题似乎都建议做我已经在做的事情 我正在尝试使用 mProductListProgressBar setVisibility View GONE 我找到它 mProductListProgressB
  • Makefile 更新了库依赖项

    我有一个很大的 makefile 它构建几个库 安装它们 然后继续构建链接到这些已安装库的对象 我的麻烦是我想使用 lfoo lbar 作为 g 标志来链接两个已安装的库 但依赖关系变得混乱 如果我更改库 foo 所依赖的标头 42 h 那
  • 查找 python 的安装位置(如果不是默认目录)

    Python 在我的机器上 我只是不知道在哪里 如果我在终端中输入 python 它将打开 Python 2 6 4 这不在它的默认目录中 肯定有一种方法可以从这里找到它的安装位置 sys有一些有用的东西 python Python 2 6
  • 如何在 3D 空间中围绕 x 轴旋转正方形

    所以我一直在尝试学习 3D 渲染是如何工作的 我尝试编写一个脚本 目标是在 3D 空间中旋转平面 2D 正方形 我首先在标准化空间 1 1 中定义一个正方形 请注意 只有 x 和 y 被标准化 class Vec3 3D VECTOR de
  • 为什么在尝试从列表中删除元素时会收到 UnsupportedOperationException?

    我有这个代码 public static String SelectRandomFromTemplate String template int count String split template split List
  • Python Selenium onclick 抛出 ElementNotInteractableException

    在我想使用 Selenium 进行交互的网站上 有以下 html 代码部分 a href img src img rename png 1 alt change name title change name a 这显示了一个小图像 单击该图
  • 根据单元格值更改 Excel 中的弧长

    我想根据单元格值动态更改 Excel 中的弧长 例如 如果单元格值 100 则拱形应成为完整的圆形 如果该值 0 它应该消失 我发现下面的代码可以更改形状的大小 但我不知道如何修改它来更改长度 Example 非常感谢您的帮助 Privat
  • 通过变量之一的值设置堆积条形图的顺序

    我被要求制作一个堆叠条形图 其中的条形和值以精确的方式堆叠和排序 在本例中 A3 在左侧 A2 在中间 A1 在右侧 我已经解决了 我没有注意到的是 我还被要求按 A1 的值降序排列条形 在这种情况下 这意味着 值 11 出现在顶部 按降序
  • Runtime.exec() 的安全问题

    我正在使用 Runtime exec 来运行可执行文件 我一直在研究并发现在应用程序中使用它时可能存在安全问题 使用 Runtime exec 运行可执行文件时是否存在安全问题 Jeanne Boyarsky 显然你不能按照你提到的方式注入
  • 本地主机上的目录名(__FILE__)

    我正在使用 WAMP 并且在 www 目录中有一个开发站点 我想用dirname FILE 定义服务器根目录的路径 目前我正在使用一个配置文件 其中包含 define PATH dirname FILE 我将配置文件包含在我的header
  • Android Studio:错误文件名、目录名或卷标语法不正确

    我使用的是 Windows 7 64 位并切换到最新的 Android Studio 但收到此错误 错误 配置项目 myproject 时出现问题 无法标准化文件 C Users me Apps Android android myproj
  • 将 8 个布尔值转换为 1 个字节的最佳方法?

    我想将 8 个布尔值保存到一个字节 然后将其保存到一个文件中 这项工作必须针对非常大的数据完成 我使用了以下代码 但我不确定它是最好的代码 就术语而言 速度和空间 int bits 1 0 0 0 0 1 1 1 char a 0 for
  • UnicodeDecodeError:“ascii”编解码器无法解码位置 47 中的字节 0x92:序号不在范围内(128)

    我正在尝试使用 Python 在 StringIO 对象中写入数据 然后最终使用 psycopg2 的 copy from 函数将此数据加载到 postgres 数据库中 首先 当我这样做时 copy from 抛出错误 错误 编码 UTF