Python操作文件封裝工具類

Python操作文件封裝

  • 解壓文件
  • 刪除文件
  • 寫入文件
  • 遞歸文件
  • 解決亂碼
  • 刪除目錄
  • 創(chuàng)建目錄
  • 去重?cái)?shù)據(jù)
# -*- coding:utf-8 -*-
import os
import re
import time
import operator
import zipfile
import rarfile
import shutil

# 找交集脚草,差集
def find_diff_str(list1,list2):
    A = set(list1).intersection(set(list2)) #交集
    B = set(list1).union(set(list2)) # 并集
    C = set(list1).difference(set(list2)) #差集,在list1中但不在list2中的元素
    D = set(list2).difference(set(list1)) #差集,在list2中但不在list1中的元素
    return A,B,C,D
 

# 對(duì)個(gè)獲取指定目錄的所有文件
def get_all_files(dir):
    fileList = []
    """遍歷獲取指定文件夾下面所有文件"""
    if os.path.isdir(dir):
        filelist = os.listdir(dir)
        for ret in filelist:
            filename = dir + "\\" + ret
            if os.path.isfile(filename):
                fileList.append(filename)
    return fileList


# 對(duì)個(gè)獲取指定目錄的所有文件
def get_file_list_by_walk(dir):
    fileList = []
    """使用listdir循環(huán)遍歷"""
    if not os.path.isdir(dir):
        return fileList
    dirlist = os.walk(dir)
    for root, dirs, files in dirlist:
        for fi in files:
            fileList.append(os.path.join(root, fi))
    return fileList

#指定文件路徑獲取文件最后文件的路徑包含文件
#如:D:\test\file.txt 返回的結(jié)果為:D:\test\
def get_file_root(path):
    #獲取文件名
    #return os.path.split(path)[1] 
    # 獲取文件路徑
    return os.path.split(path)[0]

#指定文件路徑獲取文件最后文件的路徑包含文件
#如:D:\test\file.txt 返回的結(jié)果為:file.txt
def get_file_name(path):
    return os.path.basename(path)
    
# 編碼轉(zhuǎn)換
def decode(str):
    try:
        string = str.encode('cp437').decode('gbk')
    except:
        string = str.encode('utf-8').decode('utf-8')
    return string  
# 創(chuàng)建目錄
def mkdir(path):
    # 去除尾部 \ 符號(hào)
    pathx = path.strip().rstrip("\\")
    # 判斷路徑是否存在
    # 存在     True
    # 不存在   False
    isExists = os.path.exists(pathx)
    # 判斷結(jié)果
    if not isExists:
        # 如果不存在則創(chuàng)建目錄創(chuàng)建目錄操作函數(shù)
        os.makedirs(path)
        print(path + ' 創(chuàng)建成功')
        return True
    else:
        # 如果目錄存在則不創(chuàng)建,并提示目錄已存在
        print(path + ' 目錄已存在')
        return False


"""
參考文章 https://www.jb51.net/article/180325.htm
https://blog.csdn.net/WANGYONGZIXUE/article/details/111576380
在一個(gè)數(shù)組里面找重復(fù)值
python處理去重用set函數(shù)
"""
def find_repeat_val_by_list(list):
    values = {}
    for i in list:
      if list.count(i)>1:
        values[i] = list.count(i)
    return values

"""
通過指定文件路徑文件進(jìn)行讀取內(nèi)容
如:D:\test\file.txt
"""
def reader_file(path):
    #解決亂碼問題
    fi = open(path,'r',encoding='utf-8',errors = 'ignore')
    strs = []
    #splitlines解決不換行\(zhòng)n輸出
    for line in fi.read().splitlines():
        if(len(line)>0):
            strs.append(line)
    return str

"""
創(chuàng)建一個(gè)txt文件,并向文件寫入msg
@file_dir參數(shù) 代表文件目錄 如:D:\test
@file_name參數(shù) 代表文件名稱 如:file.txt
@msg參數(shù) 代表要寫入文件的內(nèi)容信息
"""
def writer_to_file(file_dir, file_name, msg):
    # 先創(chuàng)建目錄
    mkdir(file_dir)
    # 再打開文件
    full_path = file_dir + "\\" + file_name
    fi = open(full_path, 'w')
    # 寫入文件
    fi.write(msg) 
    fi.close()




#刪除文件
def del_files(dir_path):
    # os.walk會(huì)得到dir_path下各個(gè)后代文件夾和其中的文件的三元組列表,順序自內(nèi)而外排列急膀,
    for root, dirs, files in os.walk(dir_path, topdown=False):
        # 第一步:刪除文件
        for file_name in files:
            try:
                os.remove(os.path.join(root, file_name))  # 刪除文件
            except Exception as e:
                print(f'刪除文件,失敗原因?yàn)?{e}' )
                pass
    
        # 第二步:刪除空文件夾
        for dir in dirs:
            try:
                os.rmdir(os.path.join(root, dir)) # 刪除一個(gè)空目錄
            except Exception as e:
                print(f'刪除空文件夾,失敗原因?yàn)?{e}' )
                pass
                    
# 創(chuàng)建目錄
def mkdir(path):
    # 去除尾部 \ 符號(hào) 
    pathx = path.strip().rstrip("\\")
    #print(f'pathx={pathx}')
    
    # 判斷路徑是否存在
    # 存在     True
    # 不存在   False
    isExists = os.path.exists(pathx)
    # 判斷結(jié)果
    if not isExists:
        # 如果不存在則創(chuàng)建目錄創(chuàng)建目錄操作函數(shù)
        os.makedirs(path)
        print(path + ' 創(chuàng)建成功')
        return True
    else:
        # 如果目錄存在則不創(chuàng)建,并提示目錄已存在
        print(path + ' 目錄已存在')
        return False
        

class File:
    def __init__(self):
        self.fileList = []

    """
    遞歸列表文件
    """
    def recursion_file(self, filepath):
        files = os.listdir(filepath)
        for file in files:
            fi_d = os.path.join(filepath, file)
            if os.path.isdir(fi_d):
                self.recursion_file(fi_d)
            else:
                self.fileList.append(fi_d)

    """
    獲取文件列表
    """

    def get_file_list(self, filepath):
        self.recursion_file(filepath)
        return self.fileList

"""
解壓rar文件
需要安裝WinRar并且配置環(huán)境變量
pip install rarfile
返回失敗文件
"""
def un_rar(filepath):
    fail_path = ''
    try:
        if os.path.isdir(filepath + "-file"):
            pass
        else:
            zipname = filepath
            extractpath = filepath.replace(".rar", "") + '-file'
            rar = rarfile.RarFile(zipname)
            rar.extractall(extractpath)
            rar.close()
            #os.remove(extractpath)
            #print(f'成功文件:{get_file_name(filepath)}' )
    except Exception as e:
        print(f'失敗文件為:{get_file_name(filepath)}--->>un_rar Exception file fail' )
        fail_path = filepath
        pass
    return fail_path

# 刪除空文件夾
def del_empty_file(dir_path):
    for root, dirs, files in os.walk(dir_path, topdown=False):
        for dir in dirs:
            try:
                os.rmdir(os.path.join(root, dir)) # 刪除一個(gè)空目錄
            except Exception as e:
                print(f'刪除空文件夾,失敗原因?yàn)?{e}' )
                pass
"""
解壓zip文件 返回失敗文件
"""
def un_zip(filepath):
    fail_path = ''
    # 可以自己定義路徑
    zipname = filepath
    extractpath = filepath.replace(".zip", "") + '-file'
    try:
       
        # 注意壓縮格式選擇
        frzip = zipfile.ZipFile(zipname, 'r', zipfile.ZIP_DEFLATED)
        # 將所有文件加壓縮到指定目錄
        frzip.extractall(extractpath)
        frzip.close()
    except Exception as e:
        print(f'失敗文件為:{get_file_name(filepath)}' )
        fail_path = filepath
        pass
    
    #解壓完成
    all_path_file = []
    all_path_dir = []
    for root, dirs, files in os.walk(extractpath):
        for file in files:
            file_kv = {'name': file, 'path': root}
            all_path_file.append(file_kv)
        for dir1 in dirs:
            # 文件深度
            deep_count = len(root.split('\\'))
            dir_kv = {'name': dir1, 'path': root, 'deep': deep_count}
            all_path_dir.append(dir_kv)
    # 一定是先文件再文件夾,否者重命名后文件夾內(nèi)的文件找不到,先是最大深度文件夾躏啰,所以需要深度排序
    all_path_dir = sorted(all_path_dir, key=operator.itemgetter('deep'), reverse=True)

    for dic in all_path_file + all_path_dir:
        file_name   = dic['name']
        parent_path = dic['path']
        file_name_ok  = decode(file_name)  
        err_path_name = os.path.join(parent_path, file_name)
        ok_path_name  = os.path.join(parent_path, file_name_ok)
        os.rename(err_path_name, ok_path_name)  # 重命名文件
        
    return fail_path

python讀取Excel推薦文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市耙册,隨后出現(xiàn)的幾起案子给僵,更是在濱河造成了極大的恐慌,老刑警劉巖详拙,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帝际,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡饶辙,警方通過查閱死者的電腦和手機(jī)蹲诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弃揽,“玉大人脯爪,你說我怎么就攤上這事】笪ⅲ” “怎么了痕慢?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涌矢。 經(jīng)常有香客問我掖举,道長(zhǎng),這世上最難降的妖魔是什么娜庇? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任拇泛,我火速辦了婚禮,結(jié)果婚禮上思灌,老公的妹妹穿的比我還像新娘俺叭。我一直安慰自己,他們只是感情好泰偿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布熄守。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪裕照。 梳的紋絲不亂的頭發(fā)上攒发,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音晋南,去河邊找鬼惠猿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛负间,可吹牛的內(nèi)容都是我干的偶妖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼政溃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼趾访!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起董虱,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扼鞋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后愤诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體云头,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片不跟。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慨飘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布影涉,位于F島的核電站,受9級(jí)特大地震影響规伐,放射性物質(zhì)發(fā)生泄漏蟹倾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一猖闪、第九天 我趴在偏房一處隱蔽的房頂上張望鲜棠。 院中可真熱鬧,春花似錦培慌、人聲如沸豁陆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盒音。三九已至表鳍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祥诽,已是汗流浹背譬圣。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雄坪,地道東北人厘熟。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像维哈,于是被迫代替她去往敵國(guó)和親绳姨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容