四个大字 发表于 2020-7-2 21:58:12

python30讲最后一个题

##返回文件里所有某行某位置的匹配信息
def search_in_file(file_name, key):#search_in_file(路径, 关键字)
    #f = open(file_name,encoding='unicode_escape')
    f = open(file_name,encoding='utf-8')
    count = 0# 记录行数
    key_dict = dict()# 字典,用户存放key所在具体行数对应具体位置

    for each_line in f:
      count += 1
      if key in each_line:
            pos = pos_in_line(each_line, key)# key在每行对应的位置
            key_dict = pos

    f.close()
    return key_dict
代码如上:
报错信息
Traceback (most recent call last):
File "D:/pycharmprojects/fisherctest.py", line 329, in <module>
    search_files(key, detail)
File "D:/pycharmprojects/fisherctest.py", line 319, in search_files
    key_dict = search_in_file(each_txt_file, key)
File "D:/pycharmprojects/fisherctest.py", line 298, in search_in_file
    for each_line in f:
File "D:\Python3.7\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 0: invalid start byte
尝试了百度上的几种方法,无果,有解决类似转码问题的大佬求支招

Twilight6 发表于 2020-7-2 22:11:53





将你需要检测的txt文本重新另存为保存,进行编码设置:

第一步,选择另存为:
https://xxx.ilovefishc.com/forum/202005/25/072650zqq1fqqmng421bqz.jpg
第二步,选择编码,选什么编码,open时候设置什么编码,这里选择 utf-8,open就要加上参数 encoding = 'utf-8':
https://xxx.ilovefishc.com/forum/202005/25/072647nvzjv2zemvgxet5g.jpg
如果你想open不加 encoding = 'utf-8' 那么另存为时候编码改成这里的 ANSI 即可:
https://xxx.ilovefishc.com/forum/202006/22/222937li4vv400i6v44b6z.png





sunrise085 发表于 2020-7-2 22:20:21

可以先检测文件的编码格式。
下面代码是检测编码格式的。
可能需要先安装chardet模块,看个人情况,或许你安装的python已经有chardet模块了
import chardet

f = open(file_name,'rb')# 先用二进制打开
data = f.read()# 读取文件内容
file_encoding = chardet.detect(data).get('encoding')# 得到文件的编码格式
f.close()
print(file_encoding)

sunrise085 发表于 2020-7-2 22:22:24

Twilight6 发表于 2020-7-2 22:11
将你需要检测的txt文本重新另存为保存,进行编码设置:

第一步,选择另存为:


你的方法治标不治本,在循环中,遍历多个文件的时候,很可能会遇到编码格式不一样的文件,难道还要先去把那些文件的编码格式都一一检查,改为统一的编码格式么?

Twilight6 发表于 2020-7-2 22:35:05

sunrise085 发表于 2020-7-2 22:22
你的方法治标不治本,在循环中,遍历多个文件的时候,很可能会遇到编码格式不一样的文件,难道还要先去把 ...

那确实 ,只是我想这也就课后练习,应该测试过下就行,不会大量吧

四个大字 发表于 2020-7-4 09:52:29

我是只改了这个文件夹下的其中一个文件
因为这是对一个文件夹里的所有txt文件做读操作,难道必须得把所有文件夹里所有的编码格式都搞成utf-8吗

四个大字 发表于 2020-7-4 09:54:17

sunrise085 发表于 2020-7-2 22:22
你的方法治标不治本,在循环中,遍历多个文件的时候,很可能会遇到编码格式不一样的文件,难道还要先去把 ...

对的,大佬有啥好办法没......

四个大字 发表于 2020-7-4 09:55:52

sunrise085 发表于 2020-7-2 22:20
可以先检测文件的编码格式。
下面代码是检测编码格式的。
可能需要先安装chardet模块,看个人情况,或许 ...

好的,谢谢建议。不过一个文件夹下多个TXT文件,总不能都去改编码格式......

johnnyb 发表于 2020-7-4 11:04:07

把chardet写成get_code()函数,   encoding=get_code() 不就秒杀所有文件了?

sunrise085 发表于 2020-7-4 16:20:05

四个大字 发表于 2020-7-4 09:55
好的,谢谢建议。不过一个文件夹下多个TXT文件,总不能都去改编码格式......

。。。。
我在三楼的回答就是检测编码格式的啊。
检测出编码格式,然后open(filename,'r',encoding=file_encoding),不久可以正常打开了么?

四个大字 发表于 2020-7-5 10:57:06

sunrise085 发表于 2020-7-4 16:20
。。。。
我在三楼的回答就是检测编码格式的啊。
检测出编码格式,然后open(filename,'r',encoding=fil ...

{:5_109:}了解了解,就是这么处理的

sunrise085 发表于 2020-7-5 13:32:36

四个大字 发表于 2020-7-5 10:57
了解了解,就是这么处理的

问题解决了,就评一个最佳答案呗

陈尚涵 发表于 2020-7-7 12:25:08

有必要这么麻烦嘛,你们不知道自己笔记本默认的编码呢?GB2312啊!

陈尚涵 发表于 2020-7-7 12:26:10

再说,open的默认编码也是GB2312,有必要加个编码引起问题吗?

陈尚涵 发表于 2020-7-7 12:26:48

除非处理数据大并且编码都不一样的文件

四个大字 发表于 2020-7-16 21:16:37

陈尚涵 发表于 2020-7-7 12:26
再说,open的默认编码也是GB2312,有必要加个编码引起问题吗?

哈喽,打开文件时确实是报编码异常才会去加encoding,
不确定是不是代码编译器不同导致你这样说
页: [1]
查看完整版本: python30讲最后一个题