鱼C论坛

 找回密码
 立即注册
查看: 1744|回复: 15

[已解决]python30讲最后一个题

[复制链接]
发表于 2020-7-2 21:58:12 | 显示全部楼层 |阅读模式

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

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

x
##返回文件里所有某行某位置的匹配信息
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[count] = 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
尝试了百度上的几种方法,无果,有解决类似转码问题的大佬求支招
最佳答案
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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-2 22:11:53 | 显示全部楼层




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

第一步,选择另存为:

                               
登录/注册后可看大图

第二步,选择编码,选什么编码,open时候设置什么编码,这里选择 utf-8,open就要加上参数 encoding = 'utf-8':

                               
登录/注册后可看大图

如果你想open不加 encoding = 'utf-8' 那么另存为时候编码改成这里的 ANSI 即可:

                               
登录/注册后可看大图






想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

第一步,选择另存为:

你的方法治标不治本,在循环中,遍历多个文件的时候,很可能会遇到编码格式不一样的文件,难道还要先去把那些文件的编码格式都一一检查,改为统一的编码格式么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


那确实 ,只是我想这也就课后练习,应该测试过下就行,不会大量吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-4 09:52:29 | 显示全部楼层
我是只改了这个文件夹下的其中一个文件
因为这是对一个文件夹里的所有txt文件做读操作,难道必须得把所有文件夹里所有的编码格式都搞成utf-8吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对的,大佬有啥好办法没......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-4 09:55:52 | 显示全部楼层
sunrise085 发表于 2020-7-2 22:20
可以先检测文件的编码格式。
下面代码是检测编码格式的。
可能需要先安装chardet模块,看个人情况,或许 ...

好的,谢谢建议。不过一个文件夹下多个TXT文件,总不能都去改编码格式......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-4 11:04:07 | 显示全部楼层
把chardet写成get_code()函数,   encoding=get_code() 不就秒杀所有文件了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

。。。。
我在三楼的回答就是检测编码格式的啊。
检测出编码格式,然后open(filename,'r',encoding=file_encoding),不久可以正常打开了么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-5 10:57:06 | 显示全部楼层
sunrise085 发表于 2020-7-4 16:20
。。。。
我在三楼的回答就是检测编码格式的啊。
检测出编码格式,然后open(filename,'r',encoding=fil ...

了解了解,就是这么处理的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 13:32:36 | 显示全部楼层
四个大字 发表于 2020-7-5 10:57
了解了解,就是这么处理的

问题解决了,就评一个最佳答案呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 12:25:08 | 显示全部楼层
有必要这么麻烦嘛,你们不知道自己笔记本默认的编码呢?GB2312啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 12:26:10 | 显示全部楼层
再说,open的默认编码也是GB2312,有必要加个编码引起问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 12:26:48 | 显示全部楼层
除非处理数据大并且编码都不一样的文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-16 21:16:37 | 显示全部楼层
陈尚涵 发表于 2020-7-7 12:26
再说,open的默认编码也是GB2312,有必要加个编码引起问题吗?

哈喽,打开文件时确实是报编码异常才会去加encoding,
不确定是不是代码编译器不同导致你这样说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 23:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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