Python 读取csv报错编码问题 : UnicodeDecodeError: 'utf-8' codec can't decode byte 0x87 in position 10: inval...
时间: 2023-10-09 13:13:11 浏览: 208
这个问题通常是由于csv文件的编码与Python默认读取编码不一致导致的。可以尝试以下解决方案:
1. 打开csv文件,另存为UTF-8编码格式的文件,然后再尝试读取。
2. 在读取csv文件时,指定文件的编码格式,例如:
```python
import csv
with open('example.csv', encoding='gbk') as f:
reader = csv.reader(f)
for row in reader:
print(row)
```
这里将文件的编码格式指定为gbk,适用于中文Windows系统默认的编码格式。如果你不确定文件的编码格式,可以尝试打开文件时使用'utf-8'或'latin1'编码格式。
希望这些解决方案能够帮助到你。
相关问题
报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x87 in position 10: invalid start byte是什么原因
这个报错通常是由于尝试将一个非UTF-8编码的字节序列解码为UTF-8编码时引起的。具体来说,报错中的0x87字节是一个无效的起始字节,无法被解码为有效的Unicode字符。
这个问题可能出现在以下几种情况下:
1. 输入的数据本身不是UTF-8编码。在使用UTF-8解码时,如果输入的字节序列不符合UTF-8编码规则,就会引发该错误。
2. 输入的数据包含了一些非法的字符或字节,这些字符或字节无法被解码为有效的Unicode字符。
3. 输入的数据在传输或存储过程中发生了损坏,导致其中的某些字节无法正确解码。
解决这个问题的方法取决于具体情况:
1. 确保输入的数据是以正确的编码方式进行编码的。可以尝试使用其他编码方式进行解码,或者对输入数据进行修复。
2. 如果输入数据中包含非法字符或字节,可以尝试使用合适的字符替换或删除这些非法字符。
3. 如果输入数据损坏,可以尝试从备份或其他可靠来源获取正确的数据。
python 代码报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
### 解决方案
当遇到 `UnicodeDecodeError` 错误提示 `'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte` 的时候,这通常意味着尝试用 UTF-8 编码解析的数据实际上是以其他形式编码的,比如 gzip 压缩过的数据[^1]。
对于斗鱼直播页面爬取过程中出现此问题的原因在于请求头中的 "Accept-Encoding" 字段包含了诸如 `"gzip", "deflate"` 或者 `"br"` 这样的值。这意味着服务器响应的内容可能是经过压缩的二进制流而不是纯文本 HTML。如果客户端(即编写的应用程序)不支持这些压缩算法,则会抛出上述异常因为直接按照 UTF-8 尝试解码被压缩过的内容显然是不行的[^2]。
为了修正这个问题,在发送 HTTP 请求之前应该考虑移除或修改 Accept-Encoding 头部字段来阻止服务端返回已压缩的数据;或者更推荐的做法是在接收到响应之后先对其进行适当解压再继续后续操作:
#### 方法一:禁用压缩传输
通过设置自定义 headers 来告知远程服务器不需要任何形式的压缩内容:
```python
import requests
headers = {
'Accept-Encoding': '', # 清空 accept encoding header 防止接收压缩文件
}
response = requests.get('https://www.douyu.com/', headers=headers)
print(response.text) # 正常打印网页源代码
```
这种方法简单易行但是可能会导致下载速度变慢,因为它强制要求未压缩版本的数据传输给客户端。
#### 方法二:手动处理压缩内容
另一种方式则是保留原有的 Accept-Encoding 设置并引入额外逻辑用于检测和解压可能存在的压缩格式 (如 GZIP):
```python
import zlib
import brotli
import requests
def decompress_response(resp_content, resp_headers):
if not isinstance(resp_content, bytes): raise ValueError("Response must be of type bytes.")
encodings = resp_headers.getlist('Content-Encoding')
data = resp_content
try:
while True and encodings:
next_encoding = encodings.pop()
match next_encoding.lower():
case 'gzip':
data = zlib.decompress(data, 16+zlib.MAX_WBITS)
case 'deflate':
data = zlib.decompress(data)
case 'br':
data = brotli.decompress(data)
case _ :
break
return str(data.decode())
except Exception as e:
print(f'Decompression failed with error {e}')
# 使用方法
r = requests.get(url='https://www.douyu.com/')
decompressed_text = decompress_response(r.content, r.headers)
if decompressed_text is None:
print("Failed to properly handle the response.")
else:
print(decompressed_text[:50]) # 打印前五十字符作为示例展示
```
这段脚本首先获取到完整的响应体以及头部信息,接着根据 Content-Encoding 判断具体使用的压缩算法,并依次调用相应的库函数完成解压工作最后才转成字符串输出。这种方式虽然复杂一些但更加灵活高效。
阅读全文
相关推荐
















