Crossin的编程教室

标题: 【每日一坑 4】 查找文件 [打印本页]

作者: crossin先生    时间: 2013-12-19 20:02
标题: 【每日一坑 4】 查找文件
上一个坑,取出字符串中的数字,在论坛上出现了好几种方法。除了基本的遍历判断来做外,还有一些简便的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结尾的文件,包括所有嵌套的子文件夹。
作者: 我回来啦    时间: 2013-12-19 20:11
  1. # coding:utf-8
  2. import os
  3. import fnmatch

  4. for root, dirs, files in os.walk('.'):
  5.     for file in files:
  6.         if fnmatch.fnmatch(file, "*.txt"):
  7.             print file
复制代码

作者: fl0w    时间: 2013-12-19 21:29
findThem.py
  1. #! /usr/bin/env python
  2. # coding:utf-8

  3. import os
  4. import sys

  5. if __name__ == "__main__":
  6.     if len(sys.argv) != 1 and os.path.exists(sys.argv[1]):
  7.         themAll = []
  8.         for dirpath, dirnames, filenames in os.walk(sys.argv[1]):
  9.             for filename in filenames:              
  10.                 if os.path.splitext(filename)[1] == '.txt':
  11.                     themAll.append(os.path.join(dirpath, filename))
  12.         print themAll
  13.     else:
  14.         print 'Please input like this:./findThem.py /home/fl0w'
复制代码

作者: HAO    时间: 2013-12-19 21:33
本帖最后由 HAO 于 2013-12-19 21:43 编辑
  1. # -*- coding: utf-8 -*-

  2. import os
  3. from sys import argv

  4. filename, path = argv

  5. txt_files = []

  6. if os.path.isdir(path):
  7.     for dir_path, dir_names, file_names in os.walk(path):
  8.         for file_name in file_names:
  9.             if file_name.endswith('.txt'):
  10.                 txt_files.append(file_name)


  11. print txt_files
复制代码

作者: fl0w    时间: 2013-12-19 21:39
HAO 发表于 2013-12-19 21:33

这样不能找出嵌套的子文件夹中的以.txt结尾的文件
作者: HAO    时间: 2013-12-19 21:42
fl0w 发表于 2013-12-19 21:39
这样不能找出嵌套的子文件夹中的以.txt结尾的文件

哈哈。谢谢提醒。
作者: liucy    时间: 2013-12-19 23:28
本帖最后由 liucy 于 2013-12-19 23:29 编辑
  1. # coding:utf-8
  2. import os
  3. import fnmatch

  4. def findfile(inputdir):
  5.     txtlist = []
  6.     for parent, dirnames, filename in os.walk(inputdir):
  7.         for filenames in filename:
  8.             txtlist.append(filenames)
  9.         return fnmatch.filter(txtlist, '*.txt')

  10. if __name__ == "__main__":
  11.     inputdir1 = input("Please input your dir(like this: '/Users/lemon') : ")
  12.     print findfile(inputdir1)
复制代码

作者: shallecker    时间: 2013-12-20 17:40
本帖最后由 shallecker 于 2013-12-20 17:45 编辑

带路径+txt
  1. # coding:utf-8
  2. import os, re

  3. for i in os.walk('d:'+os.sep):
  4.     for txt in i[2]:
  5.         try:
  6.             txt = re.match(r'(.*)(\.txt)', txt).group(0)
  7.             print os.path.join(i[0], txt)
  8.         except:
  9.             pass
复制代码

作者: xuefu    时间: 2013-12-21 01:59
长长的c又来了,有点乱没来得急整理。。。
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <dirent.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <sys/stat.h>

  8. #define PATH_SIZE 4096

  9. char *path;

  10. int show_txt(char *);

  11. int main(int argc, const char *argv[])
  12. {
  13.   if (argc != 2) {
  14.     printf("Usage: ./a.out <path of dir>\n");
  15.     exit(1);
  16.   }

  17.   path = malloc(PATH_SIZE);
  18.   strcpy(path, argv[1]);

  19.   show_txt(path);

  20.   free(path);

  21.   return 0;
  22. }

  23. int show_txt(char *path)
  24. {
  25.   struct stat statbuf;
  26.   struct dirent *dirp;
  27.   DIR *dp;
  28.   char *ptr;

  29.   int len = strlen(path);

  30.   if (lstat(path, &statbuf) < 0) {  /* lstat error */
  31.     perror("lstat error");
  32.     exit(1);
  33.   }

  34.   if (S_ISDIR(statbuf.st_mode) == 0) {  /* not a directory */
  35.       if (strcmp(&path[len-4], ".txt") == 0) {
  36.       printf("%s\n", path);
  37.     }
  38.     return 0;
  39.   }

  40.   ptr = path + len;
  41.   *ptr++ = '/';
  42.   *ptr = 0;

  43.   if ((dp = opendir(path)) == NULL) { /* open directory error */
  44.     perror("opendir error");
  45.     exit(1);
  46.   }

  47.   /* iterate the directory(dp)'s each element*/
  48.   while ((dirp = readdir(dp)) != NULL) {  
  49.     /* ignore the present directory and the last directory */
  50.     if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)
  51.       continue;

  52.     strcpy(ptr, dirp->d_name);  /* append the element's name to path */
  53.     show_txt(path); /* call the show_txt(char*) recursively */
  54.   }

  55.   ptr[-1] = 0;
  56.   closedir(dp);
  57.   return 0;
  58. }
复制代码

作者: scz_000    时间: 2013-12-21 16:57
  1. import os,fnmatch
  2. def find_txt(root,patterns='*.txt'):#定义主函数,接受目录与所要匹配的拓展名为参数
  3.     list_of_txt=[]#列表储存txt文件名
  4.     for dirname,subdir,filenames in os.walk(root):#使用os。walk(遍历包括子目录下所有文件),生成三组列表,第一组为当前目录地址,第二组为当下前目录下的文件夹名(没有则返回一个空列表),第三组为当前目录的所有文件
  5.         for name in filenames:#遍历每组文件名
  6.             if fnmatch.fnmatch(name,patterns):#用fnmatch。fnmatch寻找匹配的文件
  7.                 list_of_txt.append(name)#加入列表
  8.     return list_of_txt
  9. if __name__=='__main__':
  10.     dir=raw_input('directory:')
  11.     txtfiles=find_txt(dir)
  12.     print txtfiles
复制代码

作者: 海明    时间: 2013-12-24 23:21
  1. import sys                                                                  
  2. import os

  3. if len(sys.argv) != 2:
  4.     print 'Please input dirname'
  5.     sys.exit(1)

  6. dirname = sys.argv[1]
  7. for root, _dir, files in os.walk(dirname):
  8.     for file in files:
  9.         if file.endswith('.txt'):
  10.             print os.path.join(root, file)
复制代码

作者: h01m3s    时间: 2013-12-26 02:59
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. import os, fnmatch

  4. def Findfiles(path, ext):
  5.         print 'Finding %s in %s' %(ext, path)
  6.         for root, dirs, files in os.walk(path):
  7.                 for file in files:
  8.                         if fnmatch.fnmatch(file, ext):
  9.                                 print 'Found %s in %s' %(file, root)


  10. print "\n\next format '*.jpg'\n\n"
  11. path = raw_input('Path: ')
  12. ext = raw_input('Ext: ')

  13. Findfiles(path, ext)
复制代码

作者: Shen_SF    时间: 2014-1-18 10:32
  1. import os
  2. from os.path import join

  3. the_directory = raw_input('Please enter the directory\n')
  4. base_directory = os.path.basename(the_directory)
  5. os.chdir(os.path.dirname(the_directory))
  6. all_files = []
  7. for root, dirs, files in os.walk(base_directory):
  8.     for name in files:
  9.         all_files.append(join(root, name))
  10. for i in all_files:
  11.     if '.txt' in i:
  12.         print i
复制代码

作者: creek    时间: 2014-6-26 23:56
  1. #!/usr/bin/env python
  2. #coding:UTF-8

  3. import os
  4. def VisitDir(path):
  5.   for root,dirs,files in os.walk(path):
  6.       for f in files:
  7.           if os.path.splitext(f)[1]=='.exe':
  8.               print f
  9.          
  10. if __name__=="__main__":
  11.     path="."
  12.     VisitDir(path)
复制代码

作者: z344618505    时间: 2014-11-25 10:50
[i for i in test]这是一种生成list的方法,通过后面的if可以增加生成时的过滤条件。这种写法在python中很常用。
test > text ,写错了
作者: 小C    时间: 2015-11-8 00:55
本帖最后由 小C 于 2015-11-8 00:56 编辑

#Filename: ex56.py

import os
import re

dirs = os.walk('.')
while True:
    try:
        tmp = dirs.next()
        for item in tmp[2]:#元组第三个为当前目录文件名
            if re.findall(r'\w*.txt', item) :
                print item
    except:
        StopIteration
作者: manhong2112    时间: 2016-1-16 11:58
本帖最后由 manhong2112 于 2016-1-16 14:38 编辑
  1. import re
  2. import os

  3. def check(dir):
  4.   for i in os.listdir(dir):
  5.     if os.path.isdir(i): check(dir + "/" + i)
  6.     print(str(i) + "\n" if re.search(r'.*\.txt',i) else "",end="")

  7. check(os.getcwd())
复制代码

作者: xqqxjnt1988    时间: 2016-2-3 09:41
敬爱的crossin先生,能不能给我们讲讲正则表达式,我看了几次,未遂,不敢接受自己的笨拙,帮我们理一理好吗,那么多记也记不得,写也无从下手,看别人的更加眼睛发晕。但是,我不能就这么放弃了。
作者: crossin先生    时间: 2016-2-3 10:51
xqqxjnt1988 发表于 2016-2-3 09:41
敬爱的crossin先生,能不能给我们讲讲正则表达式,我看了几次,未遂,不敢接受自己的笨拙,帮我们理一理好 ...

55~59课是关于正则的,你在论坛里搜一下
http://crossin.me/search.php?mod ... =%E6%AD%A3%E5%88%99

作者: xqqxjnt1988    时间: 2016-2-3 11:24
交作业啦
献丑了
#!/usr/bin/python
#coding=utf-8
#author=xuqq
import os
#本程序试图找出指定文件夹中的所有以txt结尾的文件,包括所有嵌套的子文件夹。

def txt_search(path2):
    print "新加的目录是不是目录?os.path.isdir:\t",os.path.isdir(path2)
    print"新加的目录是不是绝对路径?os.path.isabs:\t",os.path.isabs(path2)
    print"新加的目录是否存在?os.path.exists:\t",os.path.exists(path2)
    print "*"*70
    time_flag=0
    txt_file_lists=[]
    if os.path.isdir(path2) and os.path.isabs(path2) and os.path.exists(path2):#os.path.isdir,  os.path.isabs,  os.path.exists
        for root,dir,files in os.walk(path2):               #os.walk(path)返回路径,目录名,该路径下的文件名,可以对os.walk用for循环,这样就可以遍历整个文件夹递归访问各个目录和文件
            time_flag= time_flag+1
            print "这是第%d次的深度递归:\t" %time_flag
            print "root:\t", root
            print "dir:\t", dir
            print "files:\t", files
            print "下面开始在这一层找txt:\t"
            print "$"*80
            for file_ob in files:
                suffix_tmp = os.path.splitext(file_ob)          #os.path.split(文件名)返回文件名和后缀名,是一个两个元素的列表,可以用【0】,【1】来分别访问
                print "文件的后缀名依次为:\t", suffix_tmp[1]
                if suffix_tmp[1]==".txt":
                    txt_file_lists.append(file_ob)
            print "*"*70
        print "最终找出来的txt文件如下所示:\t",txt_file_lists
    else:
        print "目录错误!"

def main():
    path1 = raw_input("pls input the path you want to search:\t")
    txt_search(path1)
   
if __name__=='__main__':
    main()
作者: xqqxjnt1988    时间: 2016-2-3 12:04
crossin先生 发表于 2016-2-3 10:51
55~59课是关于正则的,你在论坛里搜一下
http://crossin.me/search.php?mod=forum&searchid=2&orderby=la ...

谢谢先生回复,你的链接点开看到啦,O(∩_∩)O哈哈~
作者: xqqxjnt1988    时间: 2016-2-3 12:04
crossin先生 发表于 2016-2-3 10:51
55~59课是关于正则的,你在论坛里搜一下
http://crossin.me/search.php?mod=forum&searchid=2&orderby=la ...

谢谢先生回复,你的链接点开看到啦,
作者: morpheus2222    时间: 2017-1-21 16:36
import os

for path,dirs,files in os.walk("指定文件夹"):
    for file in files:
        if file.endswith(".txt"):
            print(os.path.join(path,file))



作者: 南斗    时间: 2017-3-14 21:43
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. rootdir = 'D:\AutoTest' #定义根目录
  5. i = 0

  6. #三个参数:分别返回1.父目录 2.父目录下所有文件夹名字(不含路径) 3.父目录下所有文件名字
  7. for dirpath, dirnames, filenames in os.walk(rootdir):
  8.     #print filenames
  9.     for filename in filenames: #遍历文件名称
  10.         #print filename
  11.         if filename.split('.')[1] == 'pyc': #提取文件扩展名并进行比较
  12.             i = i + 1
  13. print '后缀是pyc的文件一共有:%d个' % i
复制代码

作者: nic8523    时间: 2017-7-31 13:48
每日一坑4开始,先生给出的答案在哪里?
作者: crossin先生    时间: 2017-7-31 22:30
nic8523 发表于 2017-7-31 13:48
每日一坑4开始,先生给出的答案在哪里?

http://res.crossincode.com/wechat/exercise.html
这里有
作者: nic8523    时间: 2017-8-1 10:57
crossin先生 发表于 2017-7-31 22:30
http://res.crossincode.com/wechat/exercise.html
这里有

谢谢先生
作者: li_qiuming    时间: 2017-10-6 12:01
  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
复制代码

作者: wwyy4ever    时间: 2018-2-23 15:49
请问老师,我这个如果加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


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

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

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

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

作者: lzt0810    时间: 2018-7-3 10:34
本帖最后由 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亦可
复制代码

作者: Kris_coding    时间: 2019-7-24 18:12
本帖最后由 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 的长度
复制代码

作者: FERRYMAN    时间: 2021-2-11 18: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)
复制代码

作者: FERRYMAN    时间: 2021-2-12 21:54
好好学了一些函数,现在彳亍啦!
  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)
复制代码





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5