Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法

在python3.6版本中去掉了os.path.walk()函数

os.walk()

函数声明:walk(top,topdown=True,oneerror=None)

  • 1、参数top表示需要遍历的目录树的路径
  • 2、参数农户topdown默认是"True",表示首先返回根目录树下的文件,然后,再遍历目录树的子目录。topdown的值为"False",则表示先遍历目录树的子目录,返回子目录下的文件,最后返回根目录下的文件
  • 3、参数oneerror的默认值是"None",表示忽略文件遍历时产生的错误,如果不为空,则提供一个自定义函数提示错误信息,后边遍历抛出异常
  • 4、函数返回一个元组,该元组有3个元素,这3个元素分别表示'每次遍历的路径名,目录列表和文件列表'

os.walk()实例:

import os
def walk(path):
  if not os.path.exists(path):
    return -1
  for root,dirs,names in os.walk(path):
    for filename in names:
      print(os.path.join(root,filename)) #路径和文件名连接构成完整路径
if __name__=='__main__':
  path = "C:\\Users\\Administrator\\Desktop\\2017-9-1"
  walk(path)

输出结果:

C:\Users\Administrator\Desktop\2017-9-1\2017-9-1.txt
C:\Users\Administrator\Desktop\2017-9-1\2017-9-1storage.txt
C:\Users\Administrator\Desktop\2017-9-1\apk.conf
C:\Users\Administrator\Desktop\2017-9-1\数据采集导入质量统计_2017-09-01.docx
C:\Users\Administrator\Desktop\2017-9-1\test1\2017-9-1.txt
C:\Users\Administrator\Desktop\2017-9-1\test2\2017-9-1.txt

1.os.listdir(path='')

其中参数path为需要列出的目录路径。该函数返回指定的文件夹包含的文件或文件夹的名字的列表。

2.walk(top, topdown=True, onerror=None, followlinks=False)

os.walk(path)返回三个值:parent, dirnames, filenames,分别表示path的路径、path路径下的文件夹的名字和path路径下文件夹以外的其他文件。

应用1:在一个目录下面只有文件时可以使用os.listdir()。

比如文件test_file文件中包含三个文件,即:

test_file:
         test1.txt
         test2.txt
         test3.txt

可以使用如下代码获取每个文件的绝对路径:

>>> import os
>>> path = r'C:\Users\XXN\Desktop\test_file'
>>> for each_file in os.listdir(path):
 print(os.path.join(path,each_file))

结果如下:

C:\Users\XXN\Desktop\test_file\test1.txt
C:\Users\XXN\Desktop\test_file\test2.txt
C:\Users\XXN\Desktop\test_file\test3.txt

应用2:当一个目录下面既有文件又有目录(文件夹),可使用os.walk()读取里面所有文件。

比如文件test_file中既包含文件也包含文件夹:

Test_file:
        file1:
             test1.txt
             test2.txt
             test3.txt
        file2:
             test1.txt
             test2.txt
             test3.txt
        test1.txt
        test2.txt
        test3.txt

使用os.walk()可获得:

>>> import os
>>> path = r'C:\Users\XXN\Desktop\test_file'
>>> for parent,dirnames,filenames in os.walk(path):
 print(parent,dirnames,filenames)

结果如下:

C:\Users\XXN\Desktop\test_file ['file1', 'file2'] ['test1.txt', 'test2.txt', 'test3.txt']
C:\Users\XXN\Desktop\test_file\file1 [] ['test1.txt', 'test2.txt', 'test3.txt']
C:\Users\XXN\Desktop\test_file\file2 [] ['test1.txt', 'test2.txt', 'test3.txt']

  • parent:列出了目录路径下面所有存在的目录的名称
  • dirnames:文件夹名
  • filenames:列出了目录路径下面所有文件的名称

通过下面代码可获得给定路径下所有的文件路径:

>>> import os
>>> path = r'C:\Users\XXN\Desktop\test_file'
>>> for parent,dirnames,filenames in os.walk(path):
 for filename in filenames:
 print(os.path.join(parent,filename))

结果如下:

C:\Users\XXN\Desktop\test_file\test1.txt
C:\Users\XXN\Desktop\test_file\test2.txt
C:\Users\XXN\Desktop\test_file\test3.txt
C:\Users\XXN\Desktop\test_file\file1\test1.txt
C:\Users\XXN\Desktop\test_file\file1\test2.txt
C:\Users\XXN\Desktop\test_file\file1\test3.txt
C:\Users\XXN\Desktop\test_file\file2\test1.txt
C:\Users\XXN\Desktop\test_file\file2\test2.txt
C:\Users\XXN\Desktop\test_file\file2\test3.txt

应用3:编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹,则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符)

思路:

1.先把当前文件夹下的.txt文件以及当前文件包含的子文件夹中的.txt文件的路径全部保存至一个txt_list列表中;

2.以读取的方式打开txt_list中每个路径的文件,并将每个文件中出现关键字的行数以及关键字索引保存至一个字典dict_keywords中。

3.按格式输出。

代码演示:

import os
def print_keywords(dict_keywords):
  keys = dict_keywords.keys()
  keys = sorted(keys)
  for each in keys:
    print('关键字出现在第 %s 行,第 %s 个位置。'% (each, str(dict_keywords[each])))
def line_keywords(line, keywords):
  key_index = []
  start = line.find(keywords)
  while start!=-1:
    key_index.append(start+1)
    start = line.find(keywords, start+1)
  return key_index
def file_keywords(filename, keywords):
  f = open(filename,'r')
  line = 0
  dict_keywords = dict()
  for each_line in f:
    line +=1
    if keywords in each_line:
        key_index = line_keywords(each_line, keywords)
        dict_keywords[line]= key_index
  f.close()
  return dict_keywords
def file_search(keywords, flag):
  all_files = os.walk(os.getcwd())
  txt_list = []
  for each in all_files:
    for filename in each[2]:
      if os.path.splitext(filename)[1] == '.txt':
        txt_list.append(os.path.join(each[0],filename))
  for each_txt_file in txt_list:
    dict_keywors = file_keywords(each_txt_file, keywords)
    print('====================================================')
    print('在文件【%s】中找到关键字【%s】' % (each_txt_file, keywords))
    if flag in ['YES', 'Yes', 'yes']:
       print_keywords(dict_keywors)
keywords = input("请将该脚本放于待查找的文件夹中,请输入关键字:")
flag = input("请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):")
file_search(keywords, flag)

运行结果如下:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Python参数解析模块sys、getopt、argparse使用与对比分析

    一些命令行工具的使用能够大大简化代码脚本的维护成本,提升复用性,今天主要是借助于python提供的几种主流的参数解析工具来实现简单的功能,主要是学习实践为主,这是新年伊始开工的第一篇,还是花了一番功夫来完成写作的和实验的,希望能够帮到需要的朋友们,新的一年里,祝大家心想事成! 好了,废话不多说,下面进入正文. Python中有三个内建的模块用于处理命令行参数: 第一个:sys,最简单,只能够提供简单的参数解析功能 第二个:getopt,只能简单的处理命令行参数 ,较sys封装更好一点 第三个:a

  • Python3字符串encode与decode的讲解

    大家好,很久没更新了,也是年底了最近比较忙,同时也在研究python的其他内容,毕竟是python小白,自学道路艰难. 好了今天和大家一起探讨下python3编码过程中对的一些转码事宜. python3中对文本和二进制做了比较清晰的区分.python3默认编码为unicode,由str类型进行表示.二进制数据使用byte类型表示,所以不会将str和byte混在一起.在实际应用中我们经常需要将两者进行互转 有几点需要注意: 1:字符串通过编码转换为字节码,字节码通过解码转换为字符串 str--->

  • python环境路径配置以及命令行运行脚本

    本文实例为大家分享了python环境路径设置方法,以及命令行运行python脚本,供大家参考,具体内容如下 找Python安装目录,设置环境路径以及在命令行运行python脚本 第一点:找Python安装目录 方法一: 方法二: 输入import sys print(sys.path) 化黑线处 第二点:找到安装目录后就可以开始设置环境变量 这里我的安装目录为C:\Program Files\Python36 再字符串的末尾,加一个分号; 然后再输入你安装python的路径,如图所示 一路点确定

  • python使用Plotly绘图工具绘制散点图、线形图

    今天在研究Plotly绘制散点图的方法,供大家参考,具体内容如下 使用Python3.6 + Plotly Plotly版本2.0.0 在开始之前先说说,还需要安装库Numpy,安装方法在我的另一篇博客中有写到:python3.6下Numpy库下载与安装图文教程 因为Plotly没有自己独立的线性图形函数,所以把线性图形与散点图形全部用一个函数实现 这个函数是Scatter函数 下面举几个简单的例子 先画一个纯散点图,代码如下: import plotly import plotly.graph

  • python查询文件夹下excel的sheet名代码实例

    本文实例为大家分享了python查询文件夹下excel的sheet的具体代码,供大家参考,具体内容如下 import os,sys,stat,xlrd path=r"F:\360Downloads" sheet = input("sheet name:") def del_file(path): ls = os.listdir(path) for i in ls: c_path = os.path.join(path, i) if os.path.isdir(c_p

  • 彻底理解Python中的yield关键字

    阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结: 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件.它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)].它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存. 生成器是可以迭代的,但只可以读取它一次.因为用的时候才生成.比如 mygenerator = (x*x

  • Python提取特定时间段内数据的方法实例

    python提取特定时间段内的数据 尝试一下: data['Date'] = pd.to_datetime(data['Date']) data = data[(data['Date'] >=pd.to_datetime('20120701')) & (data['Date'] <= pd.to_datetime('20120831'))] 实际测试 ''' Created on 2019年1月3日 @author: hcl ''' import pandas as pd import

  • Python批量删除只保留最近几天table的代码实例

    Python批量删除table,只保留最近几天的table 代码如下: #!/usr/bin/python3 """ 批量删除table,只保留最近几天的table """ import pymysql import re def conn_(host='',usr='',passwd='',db='',port=3306,): conn = pymysql.connect(host, usr, passwd, db, port,charset=

  • python抓取搜狗微信公众号文章

    初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql # 创建连接 conn = pymysql.connect(host='你的数据库地址', port=端口, user='用户名', passwd='密码', db='数据库名称', charset='utf8') # 创建游标 cursor = conn.cursor() cursor.execute("sel

  • Python代码实现删除一个list里面重复元素的方法

    网上学习了的两个新方法,代码非常之简洁.看来,不是只要实现了基本功能就能交差滴,想要真的学好python还有很长的一段路呀 方法一:是利用map的fromkeys来自动过滤重复值,map是基于hash的,大数组的时候应该会比排序快点吧 方法二:是用set(),set是定义集合的,无序,非重复 方法三:是排序后,倒着扫描,遇到已有的元素删之 #!/usr/bin/python #coding=utf-8 ''' Created on 2012-2-22 Q: 给定一个列表,去掉其重复的元素,并输出

随机推荐