鱼C论坛

 找回密码
 立即注册
查看: 2196|回复: 11

懂的进来看看,做30讲最后一题的时候遇到的编码问题

[复制链接]
发表于 2014-8-1 10:11:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 被巧击的键盘丶 于 2014-8-1 14:20 编辑

我在桌面运行的时候会报这个错误: QQ截图20140801100658.png 不知道怎么解决我在其他文件夹下运行不会报错。
以下是代码:
import os

def find_keyword(path,keyword):
    file = open(path)
    line = 1#行数
    location = []#储存文本出现位置
    for details in file:
        start = 0
        while True:
            index = details.find(keyword,start)
            if index == -1:
                if location != []:
                    print('=' * 50)
                    print('在文件【{0}】中找到关键字【{1}】'.format(path,keyword))
                    print('关键字出现在第 {0} 行,第 {1} 个位置'.format(line,location))
                line += 1
                location = []
                break
            else:
                location.append(index + 1)
                start = index + 1
    file.close()

keyword = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
ins = input('请问是否需要打印关键字【{0}】在文件中的具体位置(YES/NO):'.format(keyword))

file_list = os.walk(os.getcwd())

if ins in ['YES','yes']:
    for file in file_list:
        if file[2] != []:
            for each in file[2]:
                ext = os.path.splitext(each)
                if '.txt' in ext[1]:
                    path = os.path.join(file[0],each)
                    find_keyword(path,keyword)
else:
    print('用户取消操作')


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

使用道具 举报

发表于 2014-8-1 11:10:37 | 显示全部楼层
编码的问题。 控制台输入的编码与文件的编码格式不同,
我使用的 utf-8 编码写代码来说,  
要修改的地方 file = open(path,'rb') // 以二进制的方法来读。 切记不要打成 wb(这个应该知道原因吧),

index = details.find(keyword.encode('utf-8'), start)// 把 关键字编码 utf-8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 11:54:53 | 显示全部楼层
风不吹雨下 发表于 2014-8-1 11:10
编码的问题。 控制台输入的编码与文件的编码格式不同,
我使用的 utf-8 编码写代码来说,  
要修改的地方 ...

这么修改之后虽然没有报错了,但是关键字查找不到了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 12:04:28 | 显示全部楼层
学到函数了,还有十将就到三十讲了,加油!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 12:24:49 | 显示全部楼层
wangerwanger 发表于 2014-8-1 12:04
学到函数了,还有十将就到三十讲了,加油!!!

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

使用道具 举报

发表于 2014-8-1 13:30:46 | 显示全部楼层
被巧击的键盘丶 发表于 2014-8-1 11:54
这么修改之后虽然没有报错了,但是关键字查找不到了。

keyword.encode('utf-8')
改为 keyword.encode('gbk')

控制台一般情况默认编码是 gbk 的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 14:20:15 | 显示全部楼层
风不吹雨下 发表于 2014-8-1 13:30
keyword.encode('utf-8')
改为 keyword.encode('gbk')

Thank you very muck.解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 14:36:16 | 显示全部楼层

还是有一个 bug, 打开的文档不是gbk编码的话,还是找不到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 16:09:00 | 显示全部楼层
风不吹雨下 发表于 2014-8-1 14:36
还是有一个 bug, 打开的文档不是gbk编码的话,还是找不到。

:sweat:那有没有什么完美的解决方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 20:25:25 | 显示全部楼层
被巧击的键盘丶 发表于 2014-8-1 16:09
那有没有什么完美的解决方法。

for details in file:
    try:
        details  = details().decode().encode('gbk')
except Exception:
    pass

decode() 默认对 utf-8 解码
如果 这是utf-8的话, 不产生异常
如果是 gbk 产生异常,捕获不进行处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 21:00:00 | 显示全部楼层
风不吹雨下 发表于 2014-8-1 20:25
for details in file:
    try:
        details  = details().decode().encode('gbk')

except Exception:
    pass
还有try这些都还没学过呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-3 18:11:48 | 显示全部楼层
在处理字符串时,常常会遇到不知道字符串是何种编码,如果不知道字符串的编码就不能将字符串转换成需要的编码。面对多种不同编码的输入方式,是否会有一种有效的编码方式?chardet是一个非常优秀的编码识别模块。

chardet 是python的第三方库,需要下载和安装。下载的地址有:



1.推荐地址: http://download.csdn.net/download/aqwd2008/4256178

2.官方地址:  http://pypi.python.org/pypi/chardet

如果采用源代码安装方法,有可能会提示缺少setuptools这个模块。因此这里我们采用另外一种更为方便的安装方法,不论你选择哪种安装包,将它解压得到其中的文件夹【chardet】将这个文件夹复制到【python安装根目录\Lib\site-packages】下,确保这个位置可以被python引用到。如果不能被引用到请加入环境变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 15:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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