Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UnicodeEncodeError:&x27;charmap';编解码器可以';t编码字符'\u010d';_Python - Fatal编程技术网

Python UnicodeEncodeError:&x27;charmap';编解码器可以';t编码字符'\u010d';

Python UnicodeEncodeError:&x27;charmap';编解码器可以';t编码字符'\u010d';,python,Python,我正在使用Python脚本打开一个.csv文件并将数据导入数据库。有几个拉丁字符会导致错误,所以我尝试用UTF-8编码这些字符,并使用errors='replace'规范用问号替换那些麻烦的字符。但是,即使这样做,我仍然收到以下错误: UnicodeEncodeError: 'charmap' codec can't encode character '\u010d' in position 2: character maps to <undefined> 编辑: 这是完整的回溯

我正在使用Python脚本打开一个.csv文件并将数据导入数据库。有几个拉丁字符会导致错误,所以我尝试用UTF-8编码这些字符,并使用errors='replace'规范用问号替换那些麻烦的字符。但是,即使这样做,我仍然收到以下错误:

UnicodeEncodeError: 'charmap' codec can't encode character '\u010d' in position 2: character maps to <undefined>
编辑:

这是完整的回溯

Traceback (most recent call last):
  File "c:\User\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "c:\User\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\__main__.py", line 432, in main
    run()
  File "c:\User\.vscode\extensions\ms-python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\__main__.py", line 316, in run_file
    runpy.run_path(target, run_name='__main__')
  File "C:\User\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\User\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\User\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "c:\User\Documents\Python_Projects\python_sftp_remote_server_edition.py", line 116, in <module>
    insert(localfile, c)
  File "c:\User\Documents\Python_Projects\python_sftp_remote_server_edition.py", line 28, in insert
    row[0], row[1], row[2]])
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character '\u010d' in position 2: character maps to <undefined>
回溯(最近一次呼叫最后一次):
文件“c:\User\.vscode\extensions\ms python.python-2019.8.30787\pythonFiles\ptvsd_launcher.py”,第43行,在
干管(ptvsdArgs)
文件“c:\User\.vscode\extensions\ms python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\\u_main\u_.py”,第432行,在main中
运行()
文件“c:\User\.vscode\extensions\ms python.python-2019.8.30787\pythonFiles\lib\python\ptvsd\\u_main___;.py”,运行文件第316行
runpy.run\u路径(目标,run\u名称=“”\uu主\uuuuuuuuuuuu')
文件“C:\User\AppData\Local\Programs\Python\Python37\lib\runpy.py”,第263行,在run\u路径中
pkg_name=pkg_name,script_name=fname)
文件“C:\User\AppData\Local\Programs\Python\Python37\lib\runpy.py”,第96行,在运行模块代码中
模块名称、模块规格、组件名称、脚本名称)
文件“C:\User\AppData\Local\Programs\Python\Python37\lib\runpy.py”,第85行,在运行代码中
exec(代码、运行\全局)
文件“c:\User\Documents\Python\u Projects\Python\u sftp\u remote\u server\u edition.py”,第116行,在
插入(本地文件,c)
文件“c:\User\Documents\Python\u Projects\Python\u sftp\u remote\u server\u edition.py”,第28行,插入
第[0]行、第[1]行、第[2]行)
文件“C:\Users\AppData\Local\Programs\Python37\lib\encodings\cp1252.py”,第12行,在encode中
返回codecs.charmap\u encode(输入、错误、编码表)
UnicodeEncodeError:“charmap”编解码器无法对位置2中的字符“\u010d”进行编码:字符映射到

尝试显式编码和解码单元格值。我用法语创建了一个示例.csv文件,这段代码适用于我:

import csv
import cx_Oracle
import io

localfile = 'C:/User/Documents/Upload/data.csv'
connection = cx_Oracle.connect()

with io.open(localfile, 'r', encoding='utf-8', errors='replace') as csvfile:
        for row in reader:
                connection.execute("INSERT INTO database.my_table (Column_1, Column_2, Column_3) values (:1, :2, :3)", [
                    str(row[0]).encode('utf-8').decode('utf-8'), str(row[1]).encode('utf-8').decode('utf-8'), str(row[2]).encode('utf-8').decode('utf-8')])
                    connection.execute('commit')
            connection.execute('commit')

正如回溯所揭示的,数据库希望在Windows代码页1252中接收输入。您可以尝试使用
errors='replace'
转换为此编码,然后再转换回:

item = item.encode('cp1252', errors='replace').decode('cp1252')
为了说明这一点,我们正在通过CP1252将Unicode字符串转换回Unicode,并替换任何不能往返的字符-然后将结果传递给将再次转换为CP1252的接口。可以说,这一点都不优雅


更好的策略是切换到能够正确处理Unicode的数据库。使用
errors='replace'
基本上就是要求计算机破坏有限的传统目标字符编码无法处理的任何数据。

感谢大家的帮助。虽然没有一个答案可以直接解决这个问题,但我能够利用它们进行更多的研究,最终找到一个解决方案,使脚本能够无错误地运行,并将数据插入到我的Oracle数据库中。只是想在下面发布我的(工作)代码,以防其他人遇到同样的困难

import csv
import cx_Oracle
import io

localfile = 'C:/User/Documents/Upload/data.csv'
connection = cx_Oracle.connect(conn_str, encoding="utf-8")

with io.open(localfile, 'r', encoding='utf-8', errors='backslashreplace') as csvfile:
        for row in reader:
                connection.execute("INSERT INTO database.my_table (Column_1, Column_2, Column_3) values (:1, :2, :3)", [
                    row[0], row[1], row[2]])
                    connection.execute('commit')
            connection.execute('commit')

错误
控制无效UTF-8的处理方式。“\u010d”已成功解码为Unicode字符,因此它显然不是无效的。请出示完整的回溯;但是我猜您的数据库连接没有正确设置以接收Unicode。另一个粗糙的解决方法是使用
encoding='ascii'
打开,但是整个
errors='replace'
策略首先是非常可疑的。理想情况下,您不应该破坏您处理的数据。@tripleee我已经更新了问题以显示完整的回溯。关于数据库的设置,你说得很好——我没有想到这一点。我会检查确认这不是问题。谢谢中的字符集有一些有用的背景知识
import csv
import cx_Oracle
import io

localfile = 'C:/User/Documents/Upload/data.csv'
connection = cx_Oracle.connect(conn_str, encoding="utf-8")

with io.open(localfile, 'r', encoding='utf-8', errors='backslashreplace') as csvfile:
        for row in reader:
                connection.execute("INSERT INTO database.my_table (Column_1, Column_2, Column_3) values (:1, :2, :3)", [
                    row[0], row[1], row[2]])
                    connection.execute('commit')
            connection.execute('commit')