设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 50338|回复: 23
打印 上一主题 下一主题

【每日一坑 6】 查找文件内容

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-12-26 17:39:25 |只看该作者 |正序浏览
Hello 大家好,我终于又来挖坑了。

上次的坑好像反响不是很好,论坛上只有两份解答。其实这题难度不大,不用什么特殊的函数来解决,就是字符串、队列的各种操作,可能会比较烦。如果你要用 python 来处理数据、文件,抓取网页等等,最后也都逃不过各种字符串和队列的操作。

这题本来定的比较宽松,你可以选择按标点划分成新队列,或者按照固定长度划分新队列,然后再按照元素在队列中的位置,重新整合成新队列输出。具体实现就不在微信里发了。

之前说过要挖几个跟文件相关的坑。今天就是在之前“查找文件”的基础上,增加对文件内容的检索。仍然是设定某个文件夹,不同的是要再增加一个文本参数,然后列出这个文件夹(含所有子文件夹)里,所有文件内容包括这个搜索文本的文件。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

24#
发表于 2021-2-17 11:05:54 |只看该作者
crossin先生 发表于 2021-2-16 22:33
看你具体什么需求,如果是需要检索的话,那确实是要的

作为这个练习来说,能做到检索txt内容和其他文件 ...

好的,谢谢老师
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

23#
发表于 2021-2-16 22:33:24 |只看该作者
FERRYMAN 发表于 2021-2-13 21:05
老师,我还有些问题。

报错UnicodeDecodeError的原因就是文件夹里的Word无法直接读是吗?

看你具体什么需求,如果是需要检索的话,那确实是要的

作为这个练习来说,能做到检索txt内容和其他文件的名字就够了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

22#
发表于 2021-2-13 21:05:37 |只看该作者
crossin先生 发表于 2021-2-13 20:14
word无法直接当做文本读写,可以通过异常处理来跳过。或者要用 python-docx库打开 ...

老师,我还有些问题。

报错UnicodeDecodeError的原因就是文件夹里的Word无法直接读是吗?
如果是,那如果文件夹里还有Excel,PPT之类,也要把那些库一个一个下载来用是吗?应该怎么办?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

21#
发表于 2021-2-13 20:14:27 |只看该作者
FERRYMAN 发表于 2021-2-13 19:24
老师好,能看看嘛?望得到您的建议。

这个程序有些问题。比如我在文件夹中加上一个Word文件,它就会报错。 ...

word无法直接当做文本读写,可以通过异常处理来跳过。或者要用 python-docx库打开
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

20#
发表于 2021-2-13 19:24:08 |只看该作者
老师好,能看看嘛?望得到您的建议。

这个程序有些问题。比如我在文件夹中加上一个Word文件,它就会报错。大概是这样:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 89: illegal multibyte sequence
老师能解释一下和提供个解决方法吗?谢谢啦!
  1. import os

  2. text = input('输入要检索的内容:\n')
  3. way = input('输入要检索的文件夹位置:\n')
  4. result = []

  5. for root, dirs, files in os.walk(way):
  6.     for f in files:
  7.         file_con = open(root + '\\' + f,encoding = 'utf-8').read()
  8.         if text in file_con:
  9.             result.append(f)
  10. print(result)
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

19#
发表于 2020-10-15 13:02:59 |只看该作者
jodie 发表于 2020-10-14 23:22

实际运用中,因为文件夹下可能有很多非文本文件,所以最好加上异常处理,避免报错跳出
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

52

积分

注册会员

Rank: 2

18#
发表于 2020-10-14 23:22:50 |只看该作者
  1. import os
  2. import chardet

  3. def match(search_path,match_text):
  4.     result_list = []

  5.     for root, dirs, files in os.walk(search_path):
  6.         # 遍历所有的文件
  7.         for file in files:
  8.             # 判断文件名是否以“.txt”结尾
  9.             if file.endswith(".txt"):

  10.                 # 获取文件的绝对路径
  11.                 file_path = os.path.join(root,file)
  12.                 # print(file_path)

  13.                 # 判断文件的编码格式
  14.                 with open(file_path, "rb") as obj1:
  15.                     text_b = obj1.read()
  16.                     text_encoding = chardet.detect(text_b)["encoding"]
  17.                     # print(text_encoding)

  18.                 # 用指定的编码格式打开文件,判断文本参数是否存在于文件内容
  19.                 with open(file_path, "r", encoding=text_encoding) as obj2:
  20.                     text = obj2.read()
  21.                     if match_text in text:
  22.                         result_list.append(file_path)

  23.     return result_list


  24. if __name__ == "__main__":

  25.     # 提示用户输入路径
  26.     while True:
  27.         search_path = input("请输入搜索路径: ").strip()
  28.         # 判断路径是否存在
  29.         if os.path.exists(search_path):
  30.             break
  31.         print("路径不存在!")
  32.     # 提示用户输入匹配的文字
  33.     match_text = input("请输入匹配的文字: ")
  34.     file_list = match(search_path,match_text)
  35.     # 展示匹配到的文件
  36.     print("匹配到的文件如下: ")
  37.     for one in file_list:
  38.         print(one)
复制代码

result.png (7.75 KB, 下载次数: 1049)

result.png

回复

使用道具 举报

0

主题

0

好友

10

积分

新手上路

Rank: 1

17#
发表于 2018-8-23 11:46:19 |只看该作者
crossin先生 发表于 2014-1-2 10:30
open只是在python打开,把内容读入内存,不会调用任何其他程序打开。但这个过程是很慢的。所以虽然可以实 ...

import os
import re
dirnme = 'E:\Study during Graduate school'
list_dir = []
for dirnow,folds,files in os.walk(dirnme):
    # print(dirnow)
    # print(folds)
    # print(files)
    for fs in files:
        # print(fs)
        filtext = re.findall('.txt',fs)
        if filtext:
            list_dir.append(os.path.join(dirnow, fs))
    # filtext = re.findall("*.txt",files)
    # list_dir.append(''.join(dirnow,files))
print(list_dir)
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

16#
发表于 2018-5-17 22:42:57 |只看该作者
coolqing 发表于 2018-5-16 16:48
我这边自己建了一个文件夹,里面放了一个子文件夹,一些txt、excel和word文件。
运行代码后,txt文件正常显 ...

excel、word是不能直接读取的,要读写的话,需要用专门的库
公众号回复 excel 有介绍
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-24 15:09 , Processed in 0.023318 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部