设为首页收藏本站

Crossin的编程教室

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

【每日一坑 4】 查找文件

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-12-19 20:02:50 |只看该作者 |正序浏览
上一个坑,取出字符串中的数字,在论坛上出现了好几种方法。除了基本的遍历判断来做外,还有一些简便的python解法:

1.正则
''.join(re.findall(r'\d+',text))

2.isdigit
''.join([i for i in text if i.isdigit()])

[i for i in test]这是一种生成list的方法,通过后面的if可以增加生成时的过滤条件。这种写法在python中很常用。

3.filter
filter(lambda x: x.isdigit(), text)

filter是一个过滤器,其中的lambda表达式是过滤的条件。这个稍微高深了一点,有兴趣的同学可以去搜索一下“lambda表达式”。

今天的坑,准备做一些跟文件相关的操作。先来点最基本的:

找出指定文件夹中的所有以txt结尾的文件,包括所有嵌套的子文件夹。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

34#
发表于 2021-2-12 21:54:17 |只看该作者
好好学了一些函数,现在彳亍啦!
  1. import os
  2. import fnmatch

  3. #files为该文件夹内的所有文件
  4. #fnmatch.fnmatch()得到布尔表达式
  5. dizhi = r'C:\Users\practice'
  6. result = []
  7. for root,dirs,files in os.walk(dizhi):
  8.     for file in files:
  9.         if fnmatch.fnmatch(file,'*.txt'):
  10.             result.append(file)
  11. print(result)
复制代码
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

33#
发表于 2021-2-11 18:02:02 |只看该作者
搞了老半天,程序还是不太理想

老师能看看吗?希望有个评价或者建议,谢谢啦

程序对于文件夹嵌套比较少的勉强还行,多的就会出错

还是去好好学学评论里的那些函数吧!
  1. import os
  2. import fnmatch

  3. result = []

  4. print('输入指定文件夹的路径')
  5. print('(like this: C:\\Users\\Python37)')
  6. path_input = input('路径:')
  7. path_use = '\\\\'.join(path_input.split('\\'))

  8. jias = ['']
  9. ls_jias = []
  10. ls_path_use = path_use

  11. active = False
  12. while active == False:         
  13.     for b in range(len(jias)):
  14.         ls_jias = []
  15.         path_use += '\\\\'+jias[b]
  16.         for c in os.listdir(path_use):
  17.             if fnmatch.fnmatch(c,'*.txt'):
  18.                 result.append(c)
  19.             elif fnmatch.fnmatch(c,'*.*') == False:
  20.                 ls_jias.append(c)
  21.         if len(ls_jias) == 0:
  22.             path_use = ls_path_use
  23.         elif len (ls_jias) > 0:
  24.             ls_path_use = path_use
  25.     jias = ls_jias
  26.     # print(jias)
  27.     if len(jias) == 0:  #就表示里面不再含有文件夹
  28.         active = True
  29. print(result)
复制代码
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

32#
发表于 2019-7-24 18:12:21 |只看该作者
本帖最后由 Kris_coding 于 2019-7-24 18:15 编辑

刚开始学,看前面几个的答案有点不能理解,然后搜索了 os.walk 的用法,搞了2、3个小时终于跑通了~
回帖庆祝
  1. # 找出指定文件夹中的所有以txt结尾的文件,包括所有嵌套的子文件夹。

  2. import os


  3. def findfile(path,rule = ".txt"):
  4.     txtlist = []
  5.     for fpathe,dirs,fs in os.walk(path):        # os.walk 获取所有目录
  6.         for f in fs:
  7.             filename = os.path.join(fpathe,f)
  8.             #print(filename)
  9.             if filename.endswith(rule):         # 判断是否用 .txt 结尾
  10.                 txtlist.append(filename)
  11.     return txtlist

  12. if __name__ == "__main__":
  13.     b = findfile(r"/desktop")
  14.     #print(b)
  15.     for i in b:
  16.         print(i)
  17.     print('一共有个 %d 个文件'%len(b))      # len 计算 b 的长度
复制代码
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

31#
发表于 2018-7-3 10:34:50 |只看该作者
本帖最后由 lzt0810 于 2018-7-3 10:36 编辑
  1. import os
  2. import fnmatch
  3. input_path = input("请输入你要查找的目录:\n")
  4. input_keyword = input("请输入你要查找的关键字:\n")
  5. for path,dirnames,files in os.walk(input_path):
  6.     for filename in files:
  7.         if fnmatch.fnmatch(filename,input_keyword):
  8.         #if input_keyword in filename:
  9.             print(filename)
  10. print('...结束...')


  11. #input_keyword需要满足fnmatch的格式条件,例如需要搜索txt后缀的文件,前者只需要输入txt(区分大小写),后者需要输入*txt,但是后者可以满足模糊匹配,即输入*TXT亦可
复制代码
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

30#
发表于 2018-2-23 17:23:10 |只看该作者
wwyy4ever 发表于 2018-2-23 15:49
请问老师,我这个如果加else的话,结果就不对,我只想让没有txt的文件夹打印“no txtfile”请问怎么改呢?
...

从if开始,理一下你的代码思路:

1 如果是.txt文件:输出“找到txt文件”
2 如果不是.txt文件,而且是文件夹:输出文件夹路径,输出“进入文件夹”,对文件夹内容查找txt文件
3 其它情况下(既不是.txt文件,也不是文件夹)输出no txtfile

所以,你要考虑怎么识别文件夹内有无txt文件,而不是简单加个else,你试着改下代码吧
回复

使用道具 举报

2

主题

0

好友

60

积分

注册会员

Rank: 2

29#
发表于 2018-2-23 15:49:54 |只看该作者
请问老师,我这个如果加else的话,结果就不对,我只想让没有txt的文件夹打印“no txtfile”请问怎么改呢?
import os   
MySelectPath = 'D:\python'   
def Findtxt(MyPath):  
    for i in os.listdir(MyPath):  
        FilePath = os.path.abspath(os.path.join(MyPath, i))                    
#       输出找到的.txt格式的文件  
        if os.path.splitext(i)[1]=='.txt':  
            print '找到txt文件 :', i      
        elif os.path.isdir(FilePath):  
#           print FilePath  
#           print '进入文件夹 :', i  
            Findtxt(FilePath)           
        else:  
           print i, '—— No txtFile'  
         
Findtxt(MySelectPath)
===运行结果===不是txt的文件也打印“no txtfile”了,我只想让没有txt的文件夹打印
launch.json —— No txtFile
lianxi.py —— No txtFile
modular.py —— No txtFile
my_module.py —— No txtFile
my_module.pyc —— No txtFile
找到txt文件 : none.txt
test.py —— No txtFile
test1.py —— No txtFile
找到txt文件 : data.txt
找到txt文件 : dir.txt
找到txt文件 : my_new_notes.txt
my_pickled_list.pkl —— No txtFile
找到txt文件 : new_data.txt
找到txt文件 : new_file.txt

回复

使用道具 举报

0

主题

0

好友

16

积分

新手上路

Rank: 1

28#
发表于 2017-10-6 12:01:57 |只看该作者
  1. import os
  2. import fnmatch

  3. def iterfindfiles(path,fnexp):
  4.     for root, dirs, files in os.walk(path):
  5.         for filename in fnmatch.filter(files,fnexp):
  6.             yield os.path.join(root, filename)

  7. for filename in iterfindfiles(r"G:/Python","*.txt"):
  8.     print filename
复制代码
回复

使用道具 举报

0

主题

0

好友

34

积分

新手上路

Rank: 1

27#
发表于 2017-8-1 10:57:42 来自手机 |只看该作者
crossin先生 发表于 2017-7-31 22:30
http://res.crossincode.com/wechat/exercise.html
这里有

谢谢先生
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

26#
发表于 2017-7-31 22:30:15 |只看该作者
nic8523 发表于 2017-7-31 13:48
每日一坑4开始,先生给出的答案在哪里?

http://res.crossincode.com/wechat/exercise.html
这里有
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-5-4 22:46 , Processed in 0.026841 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部