linux運維-python遞歸遍歷目錄+案例應用

1、python中walk()方法遍歷目錄基本使用

一、walk()方法的基本語法

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])python

  • top -- 是你所要遍歷的目錄的地址.
  • topdown -- 可選,爲 True,則優先遍歷top目錄,不然優先遍歷 top 的子目錄(默認爲開啓)。
  • onerror -- 可選,須要一個 callable 對象,當 walk 須要異常時,會調用。
  • followlinks -- 可選,若是爲 True,則會遍歷目錄下的快捷方式,默認開啓
  • return None-- 該函數沒有返回值會使用yield關鍵字拋出一個存放當前該層目錄(root,dirs,files)的三元組,最終將全部目錄層的的結果變爲一個生成器

          root 所指的是當前正在遍歷的這個文件夾的自己的地址shell

          dirs 是一個 list ,內容是該文件夾中全部的目錄的名字(不包括子目錄)
app

          files 一樣是 list , 內容是該文件夾中全部的文件(不包括子目錄)函數

二、基本使用舉例

2.1walk()基本使用,輸出基礎遍歷的各個結果及形式。

#!/usr/bin/ python
# walk()基本使用,輸出基礎遍歷的各個結果及形式。

import os
filedir = "/home/dsh/walk_test/"

def walk_1():
    
    filedir = "/home/dsh/walk_test/"

    for root,dirs,files in os.walk(filedir):
        print(root)
        print(dirs)
        print(files)
        print('***************************')
    #os.system('pause')

walk_1()

2.2.walk()基本使用,循環輸出各級目錄名稱。

#!/usr/bin/ python
#walk()基本使用,循環輸出各級目錄名稱。

import os

def walk_test():
    filedir = "/home/dsh/wall_test/"
    for root,dirs,files in os.walk(filedir):
        for dirs_list in dirs:
            print(dirs_list)
            print('************')
        #print("###############")

walk_test()

2.3walk()基本使用,循環輸出各級目錄下的文件名稱

#!/usr/bin/ python
# walk()基本使用,輸出各級目錄下的文件的名稱。

import os

def walk_test():
    filedir = "/home/dsh/wall_test/"
    for root,dirs,files in os.walk(filedir):
        for files_list in files:
            print(files_list)
            print("##########")

walk_test()

2.4 walk()基本使用,循環輸出各級目錄,及目錄下的文件名稱(帶有全路徑)

#!/usr/bin/ python
# walk()基本使用,輸出各級目錄,及目錄下的文件的名稱(帶有路徑)。

import os
import shutil

def walk_test():
    filedir = "/home/dsh/wall_test/"
    for root,dirs,files in os.walk(filedir):
        for dir_list in dirs:
            print(os.path.join(root,dir_list))
        for files_list in files:
            print(os.path.join(root,files_list))
        print("##########")

walk_test()

2、應用案例1

一、案例場景

需求:複製 指定分機號碼目錄  到  指定文件夾spa

以下圖,分機號碼語音文件目錄存儲結構以下:excel

二、須要知識點(python讀取excel數據,存入list)

根據需求,須要把指定的分機號碼數據,存入的list中,以便用來比對是不是目標數據code

# -*- coding:utf-8 -*-
#讀取excel數據,存入list。

import xlrd

path_file = "/home/dsh/wall_test/src/123.xlsx"

def read_excel_to_list(path_to_file):
    my_list = []
    file_name = path_to_file  #關聯帶讀取的excel文件,最好使用全路徑
    book_read = xlrd.open_workbook(file_name)   #打開文件,建立book對象
    sheet1_read = book_read.sheet_by_index(0)   #使用book對象,獲取工做簿對象
    nrows_read = sheet1_read.nrows                      #獲取sheet1工做簿的總行數
    #ncols_read = sheet1_read.ncols                     #獲取sheet1工做薄中的總列數
    #print (nrows_read)
    for i in range(nrows_read):
        cell_value = sheet1_read.cell_value(i,0)
        cell_str = str(cell_value).split('.')[0]
        #print(cell_str,end='\n')
        my_list.append(cell_str)
    return my_list

my_List = read_excel_to_list(path_file)

if "57939176" in my_List:
    print("ok")
else:
    print('false')

#print(my_List)

 

三、案例需求實現代碼

#案例需求:把voice目錄及其下各個子目錄的 指定目錄(號碼)下的文件,拷貝到其餘指定目錄。
#

import os
import shutil
import xlrd

path_file = "/home/dsh/wall_test/src/123.xlsx"
path_source = "/var/spool/voice/voice/"
#path_source = "/home/dsh/walk_test/"
path_dest = "/var/spool/voice/2018/"

def read_excel_to_list(path_to_file):
    my_list = []
    file_name = path_to_file  #關聯帶讀取的excel文件,最好使用全路徑
    book_read = xlrd.open_workbook(file_name)   #打開文件,建立book對象
    sheet1_read = book_read.sheet_by_index(0)   #使用book對象,獲取工做簿對象
    nrows_read = sheet1_read.nrows                      #獲取sheet1工做簿的總行數
    #ncols_read = sheet1_read.ncols                     #獲取sheet1工做薄中的總列數
    #print (nrows_read)
    for i in range(nrows_read):
        cell_value = sheet1_read.cell_value(i,0)
        cell_str = str(cell_value).split('.')[0]
        #print(cell_str,end='\n')
        my_list.append(cell_str)
    return my_list

my_List = read_excel_to_list(path_file)

for root,dirs,files in os.walk(path_source):                    #關聯待遍歷的指定目錄
    for dir_list in dirs:                                       #遍歷目錄集合
        if dir_list in my_List:
            os.system("mkdir -p "+path_dest+dir_list)
            source_Dir = os.path.join(root,dir_list)            #生成目標目錄的全路徑
            #shutil.copytree(source_Dir,path_dest+dir_list)     #使用shutil.copytree方法複製整個目錄
            os.system("cp "+source_Dir+"/* "+path_dest+dir_list)         #使用os.system方法執行shell命令
            #print(source_Dir)
        else:
            continue
        
print("job is done")

3、應用案例2

需求描述:遍歷指定目錄,把其及其子目錄下全部文件,移動到指定文件內。對象

代碼實現:blog

#案例需求:把2019目錄及其下各個子目錄下的全部文件(僅文件),拷貝到指定目錄2018中。
#

import os
import shutil
import xlrd

path_file = "/home/dsh/wall_test/src/123.xlsx"
path_source = "/var/spool/voice/2019/"
#path_source = "/home/dsh/walk_test/"
path_dest = "/var/spool/voice/2018/"
'''
def read_excel_to_list(path_to_file):
    my_list = []
    file_name = path_to_file  #關聯帶讀取的excel文件,最好使用全路徑
    book_read = xlrd.open_workbook(file_name)   #打開文件,建立book對象
    sheet1_read = book_read.sheet_by_index(0)   #使用book對象,獲取工做簿對象
    nrows_read = sheet1_read.nrows                      #獲取sheet1工做簿的總行數
    #ncols_read = sheet1_read.ncols                     #獲取sheet1工做薄中的總列數
    #print (nrows_read)
    for i in range(nrows_read):
        cell_value = sheet1_read.cell_value(i,0)
        cell_str = str(cell_value).split('.')[0]
        #print(cell_str,end='\n')
        my_list.append(cell_str)
    return my_list

my_List = read_excel_to_list(path_file)
'''
for root,dirs,files in os.walk(path_source):                    #關聯待遍歷的指定目錄
    for file_list in files:                                     #遍歷文件集合
        #os.system("mkdir -p "+path_dest+dir_list)
        source_filedir = os.path.join(root,file_list)           #生成目標文件的全路徑
        shutil.move(source_filedir,path_dest)                   #使用shutil.move方法移動文件到指定目錄
        #os.system("cp "+source_Dir+"/* "+path_dest)            #使用os.system方法執行shell命令
        #print(source_Dir)
        
print("job is done")
相關文章
相關標籤/搜索