鱼C论坛

 找回密码
 立即注册
查看: 2089|回复: 5

Python3读取文件时报UnicodeDecodeError错误

[复制链接]
发表于 2019-11-29 17:17:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 chunchun2017 于 2019-11-29 17:20 编辑

第030讲:文件系统:介绍一个高大上的东西的课后作业第4题,题目为

编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符),程序实现如图1:所示。

为了完成这个题目,编写代码如下:
  1. def findfile(search_path,search_name):
  2.         os.chdir(search_path)
  3.         print('当前目录是{}'.format(search_path))

  4.         len0=len(search_name)
  5.         for root,dirs,files in os.walk(search_path,topdown=False):
  6.                 for name in files:
  7.                         (f_name,f_ext)=os.path.splitext(name)
  8.                         if        f_ext=='.txt':
  9.                                 count=0
  10.                                 r_file=open(name)
  11.                                 if        search_name in r_file.read():
  12.                                         print('在文件【%s】中找到关键字【%s】' % (os.path.join(root,name),search_name))
  13.                                 r_file.close()
  14.                                 r_file=open(name)
  15.                                 for each in r_file:
  16.                                                 list0=['']
  17.                                                 count+=1
  18.                                                 len0=len(each)
  19.                                                 start=0
  20.                                                 while each.find(search_name,start)!=-1:
  21.                                                         list0[0]=count
  22.                                                         start=each.find(search_name,start)
  23.                                                         list0.append(start)
  24.                                                         if        start<len0-1:
  25.                                                                 start+=1
  26.                                                 if        list0[0]!='':
  27.                                                         print('关键字出现在第{0}行,第{1}个位置。'.format(list0[0],list0[1:]))
  28.                                

  29. import os
  30. #search_path=input(r'请输入待查找的初始目录:')
  31. search_path=r'E:\Python3\code\030讲'
  32. #search_name=input('请将该脚本放入待查找的文件夹内,请输入关键字:')
  33. search_name='小甲鱼'
  34. findfile(search_path,search_name)                               
  35.                        
复制代码

没想到运行报错,结果见图2:

于是参照网上的解决办法,设置打开文件时的encoding值,修改代码如下
  1. def findfile(search_path,search_name):


  2.         os.chdir(search_path)
  3.         print('当前目录是{}'.format(search_path))

  4.         len0=len(search_name)
  5.         for root,dirs,files in os.walk(search_path,topdown=False):
  6.                 for name in files:
  7.                         (f_name,f_ext)=os.path.splitext(name)
  8.                         if        f_ext=='.txt':
  9.                                 count=0
  10.                                 r_file=open(name,encoding='UTF-8',errors='ignore')
  11.                                 if        search_name in r_file.read():
  12.                                         print('在文件【%s】中找到关键字【%s】' % (os.path.join(root,name),search_name))
  13.                                 r_file.close()
  14.                                 r_file=open(name,encoding='UTF-8',errors='ignore')
  15.                                 for each in r_file:
  16.                                                 list0=['']
  17.                                                 count+=1
  18.                                                 len0=len(each)
  19.                                                 start=0
  20.                                                 while each.find(search_name,start)!=-1:
  21.                                                         list0[0]=count
  22.                                                         start=each.find(search_name,start)
  23.                                                         list0.append(start)
  24.                                                         if        start<len0-1:
  25.                                                                 start+=1
  26.                                                 if        list0[0]!='':
  27.                                                         print('关键字出现在第{0}行,第{1}个位置。'.format(list0[0],list0[1:]))
  28.                                

  29. import os
  30. #search_path=input(r'请输入待查找的初始目录:')
  31. search_path=r'E:\Python3\code\030讲'
  32. #search_name=input('请将该脚本放入待查找的文件夹内,请输入关键字:')
  33. search_name='小甲鱼'
  34. findfile(search_path,search_name)                               
  35.                        
复制代码


没想到运行结果却是下面的图3所示
图2和图3显示的文件行数和位置数,都是正确的,但是为什么两个版本的代码显示的结果是完全不一样的呢?
请问这个是为什么啊?求各位指点

图1

图1
2.png
3.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-29 17:51:54 From FishC Mobile | 显示全部楼层
不一定都是utf-8
编码问题就是要具体文件具体分析
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-29 19:41:07 From FishC Mobile | 显示全部楼层
编码问题只能听大神们说啥是啥了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-29 21:44:13 | 显示全部楼层
wp231957 发表于 2019-11-29 17:51
不一定都是utf-8
编码问题就是要具体文件具体分析

怎么具体分析呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-29 21:54:38 From FishC Mobile | 显示全部楼层
chunchun2017 发表于 2019-11-29 21:44
怎么具体分析呢?

要先判断文本文件的编码方式,是utf-8的就用utf-8来解码,是gbk的就用gbk来解码,其他的同类推
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-29 23:44:56 | 显示全部楼层
做一个异常捕获  try..gbk编码..except ..utf-8编码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 09:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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