python os文件夾/文件的那些實用操作

本文內容簡介


在日常的工作中,尤其是在企業的文件處理過程中,經過會出現同質文件數量多、文件內容隱藏在七八層的文件夾內,亦或是同一文件夾內的文件進行分類處理,等等任務,都對文件的自動化處理提出了更高的要求。解放雙手,提升效率,縮短時

目錄

1.根據txt文件,搜索和複製指定文件

2.複製指定文件夾內的文件,批操作(文件夾內文件名結構層次一致)

3.讀取某一文件夾內的文件名,並創建新的圖片,把名字複製給它

3.將一個文件夾內的文件,按照名字的不同,分批的保存到各自的文件夾內(歸類)

整理前

 整理後



1.根據txt文件,搜索和複製指定文件

目的:是將如下txt文件內的png的文件名,找到所在別處文件的.xml文件,對應的將他複製保存到valid_xml文件夾內。如果txt內文件名存在,但是xml文件找不到,則跳過,繼續找到,進行復制和保存。

說明:

valid.txt 內文件名,反應了該文件所包含位置的信息;

待複製的圖片在TB_ct文件夾內,保存到輸入文件夾的valid_xml文件夾內

__author__ = "lingjun"
# E-mail: [email protected]
# 微信公衆號:小白CV

# -*- coding:utf8 -*-
import os
import shutil

def main(input_path):

    with open("valid.txt", "r") as f:
        for line in f.readlines():
            line = line.strip('\n')  # 去掉列表中每一個元素的換行符

            xml_file_path=input_path+"\\"+line.split("_")[0]+"\label\\"+line.split(".")[0]+".xml"
            print('%s' % line.split(".")[0])
            print(xml_file_path)

            if os.path.exists(xml_file_path):
                shutil.copy(xml_file_path, os.path.join(input_path, 'valid_xml'))


if __name__=='__main__':
    input_path = "F:\TB_ct"
    main(input_path)

這裏就不做具體的展示了,步驟就是:逐行讀取valid.txt文件,提取每一行的內容--->然後轉化爲xml文件的名稱(因爲兩者對應文件只有文件類型後綴的不同)--->最後,前一個文件名copy到制定文件夾呢。


2.複製指定文件夾內的文件,批操作(文件夾內文件名結構層次一致)

適合文件夾結構相似的文件批操作

__author__ = "lingjun"
# E-mail: [email protected]
# 微信公衆號:小白CV

# -*- coding:utf8 -*-
import os
import shutil

############################################################
# _pneumonia 肺炎原始圖,複製指定文件夾

############################################################
def main_pneumonia(input_path,save_path):

    for f_1 in os.listdir(input_path):
        one_path=os.path.join(input_path, f_1)
        #print(f_1)

        for f_2 in os.listdir(one_path):
                num_path = os.path.join(one_path, f_2)
                #print(f_2)
                for f_3 in os.listdir(num_path):
                    name_path = os.path.join(num_path, f_3)
                    #print(f_3)
                    if f_3 == "DCM":

                        for (path, dirs, files) in os.walk(name_path):
                            for filename in files:
                                all_target_file_path = os.path.join(name_path, filename)
                                print(all_target_file_path)

                                shutil.copy(all_target_file_path, os.path.join(save_path, "pneumonia_image"))


if __name__=='__main__':
        

    input_path = "F:\image"
    save_path = "F:/temp"
    main_pneumonia(input_path, save_path)

這裏的內容和上節的內容存在相似之處,只是在獲取待處理文件名上面有所區別。該處的步驟是:逐層尋找制定名爲“DCM”文件夾--->遍歷文件夾內的文件,獲取每一個文件的完整文件path--->最後,前一個文件名copy到文件夾pneumonia_image內。

PS:上面進入文件的方式有點蠢,在你需要對文件夾名進行判斷的時候,就可以採用前面的方法。大多數情況下不需要逐層進入,可以直接採用如下的方式,直接拿到raw_path文件夾下所有枝葉的文件

    for (path, dirs, files) in os.walk(raw_path):
        for filename in files:
            n+=1
            print(filename)

3.讀取某一文件夾內的文件名,並創建新的圖片,把名字複製給它

  1. create_lable_image(),得到矩形框的左上角和右下角座標,繪製在新的空白圖片上;
  2. create_label_zero_image(),創建空白圖片。
__author__ = "lingjun"
# E-mail: [email protected]
# 微信公衆號:小白CV

# -*- coding:utf8 -*-
import os
import xml.etree.ElementTree as ET
import cv2
import numpy as np

############################################################
# 1 Create Segment Label Image,rectangle(x,y,x+w,y+h)
############################################################
def creat_label_image(xmin_list,ymin_list,xmax_list,ymax_list,width,height, filename):
    img = np.zeros([width, height, 1], np.uint8)

    for i in range(len(xmin_list)):
        img[ymin_list[i]:ymax_list[i], xmin_list[i]:xmax_list[i],:] = 255

    cv2.imwrite("./label_raw/" + filename.split('.')[0, 1]+'_label.png',img)
    cv2.destroyAllWindows()

############################################################
# 2 Create Segment Label Image,空白圖
############################################################
def creat_label_zero_image(width, height, filename):
    img = np.zeros([width, height, 1], np.uint8)

    name1, name2, _=filename.split('.')

    new_path = "F:/image_gen/label_raw/" + name1 + "_" + name2 + '.png'
    print(new_path)
    cv2.imwrite(new_path, img)
    cv2.destroyAllWindows()

############################################################
# 3 Create Image on origin_image,rectangle(x,y,x+w,y+h)
############################################################
def draw_rectangle_test(xmin_list, ymin_list, xmax_list, ymax_list, filename, xml_file_path):
    png_file_path_0=xml_file_path.split(".")[0]
    png_file=png_file_path_0.split('\\')[-1]+".png"
    png_path="F:/TB_ct/"+png_file_path_0.split('\\')[2]+"/LungWindow/"+png_file

    print(png_path)
    img = cv2.imread(png_path,cv2.IMREAD_UNCHANGED)
    for i in range(len(xmin_list)):
        cv2.rectangle(img, (xmin_list[i], ymin_list[i]), (xmax_list[i], ymax_list[i]), (0, 255, 0), 1)
    #cv2.rectangle(img, (30, 160), (360, 260), (0, 0, 255), 4)
    # cv2.namedWindow("AlanWang")
    # cv2.imshow('AlanWang', img)
    # cv2.waitKey(1000)
    cv2.imwrite("./label_raw/" + filename.split('.')[0] + '_label.png', img)
    cv2.destroyAllWindows()

def main_negative(input_path):
    for (path, dirs, files) in os.walk(input_path):
        for filename in files:
            all_image_file_path = os.path.join(input_path, filename)
            print(all_image_file_path)

            # shutil.copy(all_image_file_path, os.path.join(input_path, 'all_class_image'))

            creat_label_zero_image(512, 512, filename)

if __name__=='__main__':
    input_path = r"F:\image_gen"
    main_negative(input_path)

這裏的內容和前兩節的內容較爲不同,但都是對文件進行的操作。此處是獲取xml文件的名字和讀取到文件內矩形框座標(此處內容在第四節介紹)--->然後分別創建空白圖像--->在該空白圖像上繪製矩形框/空白圖/原圖上繪製矩形框--->把源文件名賦予新的圖片,形成一一對應關係。

3.將一個文件夾內的文件,按照名字的不同,分批的保存到各自的文件夾內(歸類)

整理前

def name_num():
    raw_path = r"E:\\normal_19"

    list_name = []

    for (path, dirs, files) in os.walk(raw_path):
        for filename in files:
            new_Documentname = "normal" +filename.split("_")[0]
            newpath=os.path.join(r"E:\nodule_lung\LIDC-IDRI\negative\normal", new_Documentname)
            if os.path.exists(newpath) == False:
                os.makedirs(newpath)
            print(os.path.join(path, filename))
            print(os.path.join(newpath, filename))
            shutil.copy(os.path.join(path, filename), os.path.join(newpath, filename))

 整理後

 

附錄
os.unlink(mark_pne_path) 實現對文件的刪除
shutil.move(file_path, os.path.join(save_path, 'TB_fp')) 實現將文件依次移動到TB_fp的文件夾內
shutil.copy(png_path, os.path.join(save_path, 'positive_raw')實現將文件依次複製到TB_fp的文件夾內

小白CV:公衆號旨在專注CV(計算機視覺)、AI(人工智能)領域相關技術,文章內容主要圍繞C++、Python編程技術,機器學習(ML)、深度學習(DL)、OpenCV等圖像處理技術,深度發掘技術要點,記錄學習工作中常用的操作,做你學習工作的問題小助手。只關注技術,做CV領域專業的知識分享平臺。
————————————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章