鱼C论坛

 找回密码
 立即注册
查看: 4127|回复: 17

open()函数中的参数encoding有什么作用

[复制链接]
发表于 2020-6-30 15:08:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,不敢输入太多字以免审核不通过
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-30 15:16:00 | 显示全部楼层
1,发帖频繁才会有审核..和字数没关系
2,改读取编码呀,比如读一本书,你用中文读不懂,就换一种语言读,或许就能读懂了。
encoding的作用就是这个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-30 15:18:47 | 显示全部楼层

encoding 就是设置编码用的, Python open函数一般默认的编码是 gbk ,我们可以通过重新赋值 encoding 来改变打开文件编码的方式


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-30 15:43:52 | 显示全部楼层
正如2、3楼所言。
我仅做一种补充:“编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。”
“解码是一种用特定方法,把数码还原成它所代表的内容或将电脉冲信号、光信号、无线电波等转换成它所代表的信息、数据等的过程。”
“Encoding意思是编码,是将信息分类的结果用一种易于被计算机和人识别的符号体系表示出来的过程,是人们统一认识、统一观点、相互交换信息的一种技术手段。编码的直接产物是代码。”

通常来说,encoding 这个参数是不用去设置的,因为现在大多数的文件的编码格式就是它默认的 gbk。
如果有需要设置的编码格式,用默认项的话,几乎就会是乱码,而编码格式并没有直观的体现。在 chardet 库里面有能查询的函数,但不是肯定的,有一定概率会出错。

上方引号的内容来自百度百科。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-30 16:42:40 | 显示全部楼层
用于设置编码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-30 17:21:56 | 显示全部楼层
设置编码,打开文件可能乱码。一般要用encoding设置编码。utf-8就是编码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-1 20:45:20 | 显示全部楼层
Twilight6 发表于 2020-6-30 15:18
encoding 就是设置编码用的, Python open函数一般默认的编码是 gbk ,我们可以通过重新赋值 encoding 来 ...
  1. import chardet
  2. from urllib import request
  3. with open('urls.txt','r') as urls:
  4.     num = 0
  5.     while 1:
  6.         url = urls.readline()
  7.         if url :
  8.             num += 1
  9.             response = request.urlopen(url).read()
  10.             encoding = chardet.detect(response)['encoding']
  11.             encoding = 'GBK' if encoding=='GB2312' else encoding
  12.             response = response.decode(encoding)
  13.             with open('url_%d.txt'%num,'w') as file:
  14.                 file.write(response)
  15.         else:break
复制代码

这个是第53课的作业代码,倒数第三行
with open('url_%d.txt'%num,'w') as file:
(open内本有参数encoding = encoding)我将encoding参数设为默认,就会报错:
Traceback (most recent call last):
  File "C:\Users\ASUS\Desktop\Python爬虫练习\第53次课作业--下载站点内容\test.py", line 14, in <module>
    file.write(response)
UnicodeEncodeError: 'gbk' codec can't encode character '\u200b' in position 14459: illegal multibyte sequence

但是我type查了,写入的内容response是字符串(<class 'str'>)

附:urls.txt的内容
  1. http://www.fishc.com
  2. http://www.baidu.com
  3. http://www.zhihu.com
  4. http://www.taobao.com
  5. https://www.baidu.com
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-1 20:50:04 | 显示全部楼层
阴阳神万物主 发表于 2020-6-30 15:43
正如2、3楼所言。
我仅做一种补充:“编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编 ...
  1. import chardet
  2. from urllib import request
  3. with open('urls.txt','r') as urls:
  4.     num = 0
  5.     while 1:
  6.         url = urls.readline()
  7.         if url :
  8.             num += 1
  9.             response = request.urlopen(url).read()
  10.             encoding = chardet.detect(response)['encoding']
  11.             encoding = 'GBK' if encoding=='GB2312' else encoding
  12.             response = response.decode(encoding)
  13.             with open('url_%d.txt'%num,'w') as file:
  14.                 file.write(response)
  15.         else:break
复制代码

由于 with open('url_%d.txt'%num,'w') as file:
中没填写参数encoding = encoding,会报错:
Traceback (most recent call last):
  File "C:\Users\ASUS\Desktop\Python爬虫练习\第53次课作业--下载站点内容\test.py", line 14, in <module>
    file.write(response)
UnicodeEncodeError: 'gbk' codec can't encode character '\u200b' in position 14459: illegal multibyte sequence

但:
  1. >>> type(response)
  2. <class 'str'>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-1 20:53:08 | 显示全部楼层
qiuyouzhi 发表于 2020-6-30 15:16
1,发帖频繁才会有审核..和字数没关系
2,改读取编码呀,比如读一本书,你用中文读不懂,就换一种语言读, ...

不是发帖频繁,应该是我发的帖子里带了其他网址,但这些网址都是课后作业给的。。。然后还不给我过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 21:02:58 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-7-1 21:11 编辑
void_island 发表于 2020-7-1 20:50
由于 with open('url_%d.txt'%num,'w') as file:
中没填写参数encoding = encoding,会报错:
Traceb ...


就是因为编码格式不对,所以才会报错!
因为这个网页的html代码不是 gbk 的编码格式!
它们的html代码的编码格式是 utf-8 与 gbk 不同!
所以才需要对 open 函数的 encoding 参数进行设置!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-1 21:20:38 | 显示全部楼层
阴阳神万物主 发表于 2020-7-1 21:02
就是因为编码格式不对,所以才会报错!
因为这个网页的html代码不是 gbk 的编码格式!
它们的html代 ...

可是,response已经解码成字符串了,而且文件也是用文本的模式打开的,为什么写入文本时还会出现编码错误的问题?不应该就是普通的写入操作吗?我不明白的是这点。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 21:28:54 | 显示全部楼层
void_island 发表于 2020-7-1 21:20
可是,response已经解码成字符串了,而且文件也是用文本的模式打开的,为什么写入文本时还会出现编码错误 ...

写入文件的过程,其实就是编码的过程,将字符串的内容按照编码规则,翻译成另外的东西。
当出现编码规则以外的东西,就无法进行编码了,于是就导致写入失败,在写入开始后又还没写完的阶段中断。
相当于要将一些你无法理解的词说给你听,要你写出来,你是个人会学习,会进步。但是编码规则它不会改变,于是乎,出现不能转换的词就需要更换编码规则。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-1 21:40:21 | 显示全部楼层
编码方式,可以类比成钥匙,只有钥匙对了才能看到原文内容,不然就是乱码。我很纳闷我在open()文件时没有填入encoding时就报错,而查看的教程都没有填写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 22:23:18 | 显示全部楼层
void_island 发表于 2020-7-1 20:50
由于 with open('url_%d.txt'%num,'w') as file:
中没填写参数encoding = encoding,会报错:
Traceb ...





你写入文件的编码不一致,在这里改下就好了,把你爬出来的网页编码同时设置为文件编码即可:
open('url_%d.txt'%num,'w',encoding=encoding) as file:

  1. import chardet
  2. from urllib import request
  3. with open('urls.txt','r') as urls:
  4.     num = 0
  5.     while 1:
  6.         url = urls.readline()
  7.         if url :
  8.             num += 1
  9.             response = request.urlopen(url).read()
  10.             encoding = chardet.detect(response)['encoding']
  11.             encoding = 'GBK' if encoding=='GB2312' else encoding
  12.             response = response.decode(encoding)
  13.             with open('url_%d.txt'%num,'w',encoding=encoding) as file:
  14.                 file.write(response)
  15.         else:break
复制代码


只是有可能会部分乱码





小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-2 08:16:10 | 显示全部楼层
void_island 发表于 2020-7-1 20:53
不是发帖频繁,应该是我发的帖子里带了其他网址,但这些网址都是课后作业给的。。。然后还不给我过

噗,好吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 19:07:03 | 显示全部楼层
设置打开的编码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 19:07:28 | 显示全部楼层
为了防止乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-5 18:33:32 | 显示全部楼层
本帖最后由 zhuchuanhan 于 2022-4-5 19:06 编辑
Twilight6 发表于 2020-7-1 22:23
你写入文件的编码不一致,在这里改下就好了,把你爬出来的网页编码同时设置为文件编码即可:

...


请问这里可不可以理解为:一个是文件的编码,一个是要写入内容的编码,两者一致才不会报错?

楼主提出的问题是:字符串写入文件,也要看文件的编码,这里我也有相同的疑问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表