如何修复''UnicodeDecodeError:'charmap'编解码器无法解码位置29815中的字节0x9d:字符映射到<undefined>''?
Posted
技术标签:
【中文标题】如何修复\'\'UnicodeDecodeError:\'charmap\'编解码器无法解码位置29815中的字节0x9d:字符映射到<undefined>\'\'?【英文标题】:How to fix ''UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 29815: character maps to <undefined>''?如何修复''UnicodeDecodeError:'charmap'编解码器无法解码位置29815中的字节0x9d:字符映射到<undefined>''? 【发布时间】:2018-09-08 18:59:13 【问题描述】:目前,我正在尝试让 Python 3 程序通过 Spyder IDE/GUI 对充满信息的文本文件进行一些操作。但是,当尝试读取文件时,出现以下错误:
File "<ipython-input-13-d81e1333b8cd>", line 77, in <module>
parser(f)
File "<ipython-input-13-d81e1333b8cd>", line 18, in parser
data = infile.read()
File "C:\ProgramData\Anaconda3\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 29815: character maps to <undefined>
程序代码如下:
import os
os.getcwd()
import glob
import re
import sqlite3
import csv
def parser(file):
# Open a TXT file. Store all articles in a list. Each article is an item
# of the list. Split articles based on the location of such string as
# 'Document PRN0000020080617e46h00461'
articles = []
with open(file, 'r') as infile:
data = infile.read()
start = re.search(r'\n HD\n', data).start()
for m in re.finditer(r'Document [a-zA-Z0-9]25\n', data):
end = m.end()
a = data[start:end].strip()
a = '\n ' + a
articles.append(a)
start = end
# In each article, find all used Intelligence Indexing field codes. Extract
# content of each used field code, and write to a CSV file.
# All field codes (order matters)
fields = ['HD', 'CR', 'WC', 'PD', 'ET', 'SN', 'SC', 'ED', 'PG', 'LA', 'CY', 'LP',
'TD', 'CT', 'RF', 'CO', 'IN', 'NS', 'RE', 'IPC', 'IPD', 'PUB', 'AN']
for a in articles:
used = [f for f in fields if re.search(r'\n ' + f + r'\n', a)]
unused = [[i, f] for i, f in enumerate(fields) if not re.search(r'\n ' + f + r'\n', a)]
fields_pos = []
for f in used:
f_m = re.search(r'\n ' + f + r'\n', a)
f_pos = [f, f_m.start(), f_m.end()]
fields_pos.append(f_pos)
obs = []
n = len(used)
for i in range(0, n):
used_f = fields_pos[i][0]
start = fields_pos[i][2]
if i < n - 1:
end = fields_pos[i + 1][1]
else:
end = len(a)
content = a[start:end].strip()
obs.append(content)
for f in unused:
obs.insert(f[0], '')
obs.insert(0, file.split('/')[-1].split('.')[0]) # insert Company ID, e.g., GVKEY
# print(obs)
cur.execute('''INSERT INTO articles
(id, hd, cr, wc, pd, et, sn, sc, ed, pg, la, cy, lp, td, ct, rf,
co, ina, ns, re, ipc, ipd, pub, an)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?)''', obs)
# Write to SQLITE
conn = sqlite3.connect('factiva.db')
with conn:
cur = conn.cursor()
cur.execute('DROP TABLE IF EXISTS articles')
# Mirror all field codes except changing 'IN' to 'INC' because it is an invalid name
cur.execute('''CREATE TABLE articles
(nid integer primary key, id text, hd text, cr text, wc text, pd text,
et text, sn text, sc text, ed text, pg text, la text, cy text, lp text,
td text, ct text, rf text, co text, ina text, ns text, re text, ipc text,
ipd text, pub text, an text)''')
for f in glob.glob('*.txt'):
print(f)
parser(f)
# Write to CSV to feed Stata
with open('factiva.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
with conn:
cur = conn.cursor()
cur.execute('SELECT * FROM articles WHERE hd IS NOT NULL')
colname = [desc[0] for desc in cur.description]
writer.writerow(colname)
for obs in cur.fetchall():
writer.writerow(obs)
【问题讨论】:
【参考方案1】:从https://en.wikipedia.org/wiki/Windows-1252 看到,CP1252 中没有定义代码 0x9D。
“错误”是例如在您的 open
函数中:您没有指定编码,因此 python(仅在 windows 中)将使用一些系统编码。一般来说,如果你读取的文件可能不是在同一台机器上创建的,最好指定编码。
我建议在您的open
上也添加一个编码以编写 csv。明确一点真的更好。
我不知道原始文件格式,但是添加到打开 , encoding='utf-8'
通常是一件好事(在 Linux 和 MacOs 中是默认设置)。
【讨论】:
What should I do when someone answers my question? 我在 Windows 中使用 Wsl。我的 python 脚本在 Linux 上运行良好,但在 Windows 上无法运行。怎么知道linux用的是哪个解码,所以在windows上可以用(utf-8不行) Linux 使用 UTF-8(但如果您使用的是从未更新过的旧发行版)。 “不要在 WIndows 上工作”我们无能为力:太笼统了。常见问题:您将print
用于未设置为 UTF-8 的外壳/控制台/终端,或者您正在混合编码(某些输入可能在系统编码上)。您会在 Windows 编码问题上找到许多答案(在此站点上)。只是您需要了解的不仅仅是“不工作”的问题。【参考方案2】:
上面的方法对我不起作用,试试这个:, errors='ignore'
创造奇迹!
【讨论】:
同时使用 encoding='utf-8' 和 errors='ignore' 会更有意义 隐藏错误通常是错误的做法。这仅在不寻常的情况下才有意义,但更常见的是不了解编码的人在绝望中使用。现在是阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)的好时机【参考方案3】:errors='ignore' 解决了我的头痛问题:
如何在目录和子目录中找到“coma”这个词=
import os
rootdir=('K:\\0\\000.THU.EEG.nedc_tuh_eeg\\000edf.01_tcp_ar\\01_tcp_ar\\')
for folder, dirs, files in os.walk(rootdir):
for file in files:
if file.endswith('.txt'):
fullpath = os.path.join(folder, file)
with open(fullpath, 'r', errors='ignore') as f:
for line in f:
if "coma" in line:
print(fullpath)
break
【讨论】:
您好,欢迎您。使用pathlib
,无论如何都比os
好。【参考方案4】:
在 open 语句中添加编码 例如:
f=open("filename.txt","r",encoding='utf-8')
【讨论】:
【参考方案5】:如果您不需要解码,您也可以尝试file = open(filename, 'rb')
'rb' 转换为读取二进制文件。假设您只想上传到网站
【讨论】:
以上是关于如何修复''UnicodeDecodeError:'charmap'编解码器无法解码位置29815中的字节0x9d:字符映射到<undefined>''?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复''UnicodeDecodeError:'charmap'编解码器无法解码位置29815中的字节0x9d:字符映射到<undefined>''?
Python/Flask:UnicodeDecodeError/UnicodeEncodeError:“ascii”编解码器无法解码/编码
在Python上读取文件时,我得到了一个UnicodeDecodeError。我该怎么做才能解决这个问题?