鱼C论坛

 找回密码
 立即注册
查看: 935|回复: 9

[已解决]再开一贴,还是关于文件搜索的

[复制链接]
发表于 2019-3-25 15:52:13 | 显示全部楼层 |阅读模式

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

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

x
  1. # coding: utf-8
  2. from os import listdir

  3. #程序的功能就是从e:\gcc-html\gcc的所有文件中搜索keyword
  4. #如果在哪个文件中找到了这个字符串,就把该文件名输出到屏幕

  5. if __name__=="__main__":
  6.   keyword=input('please input find chars:')
  7.   files=listdir('e:\gcc-html\gcc')
  8.   flag=0
  9.   for file in files:
  10.     ftmp="e:\\gcc-html\\gcc\"+file
  11.     fo = open(ftmp, "r",encoding='windows-1252')
  12.     #print("正在处理 %s"%file)
  13.     if keyword in fo.read():
  14.        flag+=1
  15.        print(file)
  16.   if flag==0:print("keyword:%s no found "%keyword)
复制代码


这个搜索ansi 字符串 没有问题,能运行 且得到正确结果

但是搜汉字词语就找不到了,例如:
e:\>python ex14.py
please input find chars:电脑
keyword:电脑 no found
(这个电脑这两个字是存在某个txt里的)
最佳答案
2019-3-25 18:40:47
     估计是汉字编码的问题,键入以下代码,测试一下,看看结果:
  1. # coding: utf-8

  2. if __name__=="__main__":
  3.     keyword = input('please input find chars:')  # 键盘输入两个汉字:'电脑'
  4.     for x in keyword:
  5.         print ' 0x%02x' % ord(x) ,               # 看看屏幕输出是不是:0xb5  0xe7  0xc4  0xd4
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-25 18:40:47 | 显示全部楼层    本楼为最佳答案   
     估计是汉字编码的问题,键入以下代码,测试一下,看看结果:
  1. # coding: utf-8

  2. if __name__=="__main__":
  3.     keyword = input('please input find chars:')  # 键盘输入两个汉字:'电脑'
  4.     for x in keyword:
  5.         print ' 0x%02x' % ord(x) ,               # 看看屏幕输出是不是:0xb5  0xe7  0xc4  0xd4
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 08:42:42 | 显示全部楼层
jackz007 发表于 2019-3-25 18:40
估计是汉字编码的问题,键入以下代码,测试一下,看看结果:

我再交互模式下和运行模式下得到一致结果

0x7535
0x8111

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

使用道具 举报

 楼主| 发表于 2019-3-26 08:47:03 | 显示全部楼层
哦  也没啥问题   详见:

我再百度查了一下  : 你说的内码是 GBK内码16进制
而我得到这个结果是  Unicode编码16进制(这没啥问题啊,从py文件本身,还是哪里 不都是utf-8 吗)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 08:57:56 | 显示全部楼层
补充,我又特意查看了一下,我要搜索的含有“电脑”两个字的 文本文件  它的编码格式是GB2312  

确实是和我的utf-8  冲突啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 09:28:48 | 显示全部楼层
这样就能查到了,
  1. # coding: utf-8
  2. from os import listdir

  3. if __name__=="__main__":
  4.   keyword=input('please input find chars:')
  5.   ftmp=u"e:\gcc-html\gcc\桌面显示ie图标.txt"
  6.   fo = open(ftmp, "r",encoding='GB2312')
  7.   if keyword in fo.read():
  8.     print(ftmp)
复制代码


其原因我猜测是我的原始文件目录中(即便都是文本文件,可是编码格式却是啥都有) 我只针对一个文件  就能办到了
我还要继续研究下去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-26 11:02:59 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-26 11:04 编辑
wp231957 发表于 2019-3-26 09:28
这样就能查到了,

其原因我猜测是我的原始文件目录中(即便都是文本文件,可是编码格式却是啥都有) 我 ...


    其实,utf8 与 unicode 还不能划等号,你得到的 16 进制码是 unicode 的,请运行一下下面的代码,区别一目了然:
  1. def hexbytes(s):
  2.     ret = '0x%02x' % ord(s[0])
  3.     for i in range(1 , len(s)):
  4.         ret += ' 0x%02x' % ord(s[i])
  5.     return ret

  6. a = unichr(0x7535) + unichr(0x8111)
  7. b = a . encode("utf8")
  8. c = a . encode("gbk")
  9. d = a . encode("gb2312")
  10. e = b . decode("utf8")

  11. print a , 'unicode : ' , hexbytes(a)
  12. print b , '   utf8 : ' , hexbytes(b)
  13. print c , '    gbk : ' , hexbytes(c)
  14. print d , ' gb2312 : ' , hexbytes(d)
  15. print e , 'default : ' , hexbytes(e)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 11:10:22 | 显示全部楼层
jackz007 发表于 2019-3-26 11:02
其实,utf8 与 unicode 还不能划等号,你得到的 16 进制码是 unicode 的,请运行一下下面的代码, ...

2.x 代码  运行不了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-26 11:35:07 | 显示全部楼层
  1. a = unichr(0x7535) + unichr(0x8111)
复制代码

    改为下面试试:
  1. a = chr(0x7535) + chr(0x8111)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-26 13:38:35 | 显示全部楼层
只有第一个print被执行 执行结果如下:

电脑 unicode :  0x7535 0x8111
Traceback (most recent call last):
  File "ex16.py", line 14, in <module>
    print (b , '   utf8 : ' , hexbytes(b))
  File "ex16.py", line 2, in hexbytes
    ret = '0x%02x' % ord(s[0])
TypeError: ord() expected string of length 1, but int found

修改后代码如下:

  1. def hexbytes(s):
  2.     ret = '0x%02x' % ord(s[0])
  3.     for i in range(1 , len(s)):
  4.         ret += ' 0x%02x' % ord(s[i])
  5.     return ret

  6. a = chr(0x7535) + chr(0x8111)
  7. b = a.encode("utf8")
  8. c = a.encode("gbk")
  9. d = a.encode("gb2312")
  10. e = b.decode("utf8")

  11. print (a , 'unicode : ' , hexbytes(a))
  12. print (b , '   utf8 : ' , hexbytes(b))
  13. print (c , '    gbk : ' , hexbytes(c))
  14. print (d , ' gb2312 : ' , hexbytes(d))
  15. print (e , 'default : ' , hexbytes(e))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 00:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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