鱼C论坛

 找回密码
 立即注册
查看: 1782|回复: 12

[已解决]零基础学习Python第30课练习中的问题

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

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

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

x
参考第30课的回答,自己写了如下代码,为什么不对,(要在C:\Users\wutin\Documents\Python\Exercises下查找)
import os

def print_pos(key_dict):
    keys = key_dict.keys()
    keys = sort(keys)
    for each_key in keys:
        print('关键词在第%s行,第%s个位置' % (each_key,str(key_dict[each_key])))

def pos_in_line(line,keyword):
    pos = []
    begin = line.find(keyword)
    while begin != -1:
        pos.append(begin+1)
        begin = line.finde(keyword,begin+1)
    return pos

def search_in_file(file,keyword):
    f = open(file,encoding='utf-8')
    line_num = 0
    key_dict = dict()

    for each_line in file:
        count += 1
        if keyword in each_line:
            key_dict[count] = pos_in_line(each_line,keyword)

    f.close()
    return key_dict

def search_files(keyword):
    all_files = os.walk(os.getcwd())
    txt_files = []

    for i in all_files:
        for each_file in i[2]:
            if os.path.splitext(each_file)[1] == '.txt':
                txt_files.append(os.path.join(i[0],each_file)

    for each_txt_file in txt_files:
        key_dict = seach_in_file(each_txt_file,keyword)
        if key_dict:
            print('===========================================')
            print('在文件%s中找到关键词%s' % (each_txt_file,keyword))
            print_pos(key_dict)

keyword = input('请输入查找的关键词')
os.chdir('C:\Users\wutin\Documents\Python\Exercises')
search_files(keyword)
                                
最佳答案
2020-6-29 21:03:50
Tshirt 发表于 2020-6-29 20:37
是这样的:

Traceback (most recent call last):

文件编码的问题,比如txt文件可以是多个编码方式。

f = open(file,encoding='utf-8')


而你上面这句代码使用'utf-8'编码打开,当文件本身不是通过utf-8编码时,就无法读取了,你可以用notepad++打开重新编码,如果是txt文件直接打开后另存时选择编码方式,再用对应编码类型读取;
例如:假设你文件编码是'gbk',你的代码就需要改成:f = open(file,encoding='gbk')


微信图片_20200629204439.png
微信图片_20200629205625.png

你也可以用下面的方式,获取文件的编码类型

执行

import chardet

f = open('a.doc',r)

data = f.read()

print chardet.detect(data)



结果

{'confidence': 0.64465744, 'encoding': 'utf-8'}

前面是相似度  后面是编码格式



或者 return chardet.detect(data).get("encoding") 直接获取文件编码格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-27 23:19:10 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-27 23:22 编辑



你的代码错误好多。。。比如不知从哪里变出的  count ,sort(keys) ,还有填错的方法名 seach_in_file 少了个字母 r 。。。

帮你改了下错误的地方,代码其他地方没看,至少不会报语法错误了
import os

def print_pos(key_dict):
    keys = key_dict.keys()
    keys = keys.sort()
    for each_key in keys:
        print('关键词在第%s行,第%s个位置' % (each_key,str(key_dict[each_key])))

def pos_in_line(line,keyword):
    pos = []
    begin = line.find(keyword)
    while begin != -1:
        pos.append(begin+1)
        begin = line.finde(keyword,begin+1)
    return pos

def search_in_file(file,keyword):
    f = open(file,encoding='utf-8')
    line_num = 0
    key_dict = dict()
    count = 0
    for each_line in file:
        count += 1
        if keyword in each_line:
            key_dict[count] = pos_in_line(each_line,keyword)

    f.close()
    return key_dict

def search_files(keyword):
    all_files = os.walk(os.getcwd())
    txt_files = []

    for i in all_files:
        for each_file in i[2]:
            if os.path.splitext(each_file)[1] == '.txt':
                txt_files.append(os.path.join(i[0],each_file))

    for each_txt_file in txt_files:
        key_dict = search_in_file(each_txt_file,keyword)
        if key_dict:
            print('===========================================')
            print('在文件%s中找到关键词%s' % (each_txt_file,keyword))
            print_pos(key_dict)

keyword = input('请输入查找的关键词')
os.chdir('C:\Users\wutin\Documents\Python\Exercises')
search_files(keyword)

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

使用道具 举报

 楼主| 发表于 2020-6-28 08:41:36 | 显示全部楼层
谢谢,您的回答。的确有不少错误,自己太粗心了。就是您和我修改的代码都出现如下错误"(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3 truncated \UXXXXXXXX escape ’不知道是什么原因。 发现就是这个语句造成的“os.chdir('c:\Users\wutin\Documents\Python\Exercises')”,不知道是什么原因?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 08:55:33 | 显示全部楼层
Tshirt 发表于 2020-6-28 08:41
谢谢,您的回答。的确有不少错误,自己太粗心了。就是您和我修改的代码都出现如下错误"(unicode error) 'un ...

路径里:C:\Users\wutin\Documents\Python\Exercises
\u在python中表示后续是UNICODE编码,所以不能解析路径
你可以改成
os.chdir(r'C:\Users\wutin\Documents\Python\Exercises')
前面+r可以去除转义字符,既后方为纯文本。
应该是这样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 15:58:18 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-6-27 23:19
你的代码错误好多。。。比如不知从哪里变出的  count ,sort(keys) ,还有填错的方法名 seach_in_file  ...

为什么我把楼主的代码复制过去运行的时候所有的空格都会报错,然后我删掉重新空格就好了,你也是这样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 16:40:25 | 显示全部楼层
tiger吴 发表于 2020-6-28 15:58
为什么我把楼主的代码复制过去运行的时候所有的空格都会报错,然后我删掉重新空格就好了,你也是这样吗

不会呀....不会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 17:19:16 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-6-28 16:40
不会呀....不会报错

卧槽,手机用户又被打脸了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-28 17:21:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-28 17:23:15 | 显示全部楼层
tiger吴 发表于 2020-6-28 17:19
卧槽,手机用户又被打脸了

  其他地方我没看,代码运行可能会报错,但是不会报语法之类的错误了 ~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 07:38:19 | 显示全部楼层
yhhpf 发表于 2020-6-28 08:55
路径里:C:%users\wutin\Documents\Python\Exercises
%u在python中表示后续是UNICODE编码,所以不能解析 ...

谢谢您的回复,的确按您建议可以运行,但是半道中出现这样的错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte,小甲鱼的代码运行也有这个报错,不知道什么原因?谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 09:32:43 | 显示全部楼层
Tshirt 发表于 2020-6-29 07:38
谢谢您的回复,的确按您建议可以运行,但是半道中出现这样的错误:UnicodeDecodeError: 'utf-8' codec ca ...

你新用的代码是什么?哪一行报错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 20:37:04 | 显示全部楼层
yhhpf 发表于 2020-6-29 09:32
你新用的代码是什么?哪一行报错了?

是这样的:

Traceback (most recent call last):
  File "C:\Users\wutin\Documents\Python\Exercises\30-4.py", line 49, in <module>
    search_files(keyword)
  File "C:\Users\wutin\Documents\Python\Exercises\30-4.py", line 41, in search_files
    key_dict = search_in_file(each_txt_file,keyword)
  File "C:\Users\wutin\Documents\Python\Exercises\30-4.py", line 22, in search_in_file
    for each_line in f:
  File "C:\Program Files\Python38\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 21:03:50 | 显示全部楼层    本楼为最佳答案   
Tshirt 发表于 2020-6-29 20:37
是这样的:

Traceback (most recent call last):

文件编码的问题,比如txt文件可以是多个编码方式。

f = open(file,encoding='utf-8')


而你上面这句代码使用'utf-8'编码打开,当文件本身不是通过utf-8编码时,就无法读取了,你可以用notepad++打开重新编码,如果是txt文件直接打开后另存时选择编码方式,再用对应编码类型读取;
例如:假设你文件编码是'gbk',你的代码就需要改成:f = open(file,encoding='gbk')


微信图片_20200629204439.png
微信图片_20200629205625.png

你也可以用下面的方式,获取文件的编码类型

执行

import chardet

f = open('a.doc',r)

data = f.read()

print chardet.detect(data)



结果

{'confidence': 0.64465744, 'encoding': 'utf-8'}

前面是相似度  后面是编码格式



或者 return chardet.detect(data).get("encoding") 直接获取文件编码格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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