void_island 发表于 2020-6-30 15:08:48

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

如题,不敢输入太多字以免审核不通过

qiuyouzhi 发表于 2020-6-30 15:16:00

1,发帖频繁才会有审核..和字数没关系
2,改读取编码呀,比如读一本书,你用中文读不懂,就换一种语言读,或许就能读懂了。
encoding的作用就是这个。

Twilight6 发表于 2020-6-30 15:18:47


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


阴阳神万物主 发表于 2020-6-30 15:43:52

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

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

上方引号的内容来自百度百科。

liuzhengyuan 发表于 2020-6-30 16:42:40

用于设置编码

青出于蓝 发表于 2020-6-30 17:21:56

设置编码,打开文件可能乱码。一般要用encoding设置编码。utf-8就是编码

void_island 发表于 2020-7-1 20:45:20

Twilight6 发表于 2020-6-30 15:18
encoding 就是设置编码用的, Python open函数一般默认的编码是 gbk ,我们可以通过重新赋值 encoding 来 ...

import chardet
from urllib import request
with open('urls.txt','r') as urls:
    num = 0
    while 1:
      url = urls.readline()
      if url :
            num += 1
            response = request.urlopen(url).read()
            encoding = chardet.detect(response)['encoding']
            encoding = 'GBK' if encoding=='GB2312' else encoding
            response = response.decode(encoding)
            with open('url_%d.txt'%num,'w') as file:
                file.write(response)
      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的内容
http://www.fishc.com
http://www.baidu.com
http://www.zhihu.com
http://www.taobao.com
https://www.baidu.com

void_island 发表于 2020-7-1 20:50:04

阴阳神万物主 发表于 2020-6-30 15:43
正如2、3楼所言。
我仅做一种补充:“编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编 ...

import chardet
from urllib import request
with open('urls.txt','r') as urls:
    num = 0
    while 1:
      url = urls.readline()
      if url :
            num += 1
            response = request.urlopen(url).read()
            encoding = chardet.detect(response)['encoding']
            encoding = 'GBK' if encoding=='GB2312' else encoding
            response = response.decode(encoding)
            with open('url_%d.txt'%num,'w') as file:
                file.write(response)
      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
但:
>>> type(response)
<class 'str'>

void_island 发表于 2020-7-1 20:53:08

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

不是发帖频繁,应该是我发的帖子里带了其他网址,但这些网址都是课后作业给的。。。然后还不给我过

阴阳神万物主 发表于 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 参数进行设置!

void_island 发表于 2020-7-1 21:20:38

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

可是,response已经解码成字符串了,而且文件也是用文本的模式打开的,为什么写入文本时还会出现编码错误的问题?不应该就是普通的写入操作吗?我不明白的是这点。。。

阴阳神万物主 发表于 2020-7-1 21:28:54

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

写入文件的过程,其实就是编码的过程,将字符串的内容按照编码规则,翻译成另外的东西。
当出现编码规则以外的东西,就无法进行编码了,于是就导致写入失败,在写入开始后又还没写完的阶段中断。
相当于要将一些你无法理解的词说给你听,要你写出来,你是个人会学习,会进步。但是编码规则它不会改变,于是乎,出现不能转换的词就需要更换编码规则。

XYZFORZY 发表于 2020-7-1 21:40:21

编码方式,可以类比成钥匙,只有钥匙对了才能看到原文内容,不然就是乱码。我很纳闷我在open()文件时没有填入encoding时就报错,而查看的教程都没有填写{:10_266:}

Twilight6 发表于 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:

import chardet
from urllib import request
with open('urls.txt','r') as urls:
    num = 0
    while 1:
      url = urls.readline()
      if url :
            num += 1
            response = request.urlopen(url).read()
            encoding = chardet.detect(response)['encoding']
            encoding = 'GBK' if encoding=='GB2312' else encoding
            response = response.decode(encoding)
            with open('url_%d.txt'%num,'w',encoding=encoding) as file:
                file.write(response)
      else:break

只是有可能会部分乱码





qiuyouzhi 发表于 2020-7-2 08:16:10

void_island 发表于 2020-7-1 20:53
不是发帖频繁,应该是我发的帖子里带了其他网址,但这些网址都是课后作业给的。。。然后还不给我过

噗,好吧

临时号 发表于 2020-8-1 19:07:03

设置打开的编码

陈尚涵 发表于 2020-8-1 19:07:28

为了防止乱码

zhuchuanhan 发表于 2022-4-5 18:33:32

本帖最后由 zhuchuanhan 于 2022-4-5 19:06 编辑

Twilight6 发表于 2020-7-1 22:23
你写入文件的编码不一致,在这里改下就好了,把你爬出来的网页编码同时设置为文件编码即可:

...

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

楼主提出的问题是:字符串写入文件,也要看文件的编码,这里我也有相同的疑问。
页: [1]
查看完整版本: open()函数中的参数encoding有什么作用