實戰(zhàn):文件處理:獲取編碼,解決亂碼炎咖,備份目錄赃泡,清空文件

處理文件

  • file_encoding(filepath) :小文件的時候調用,獲取文件的編碼乘盼,可以傳入open()函數(shù)encoding參數(shù)升熊。filepath是個文件
  • file_encoding_big(filepath) :同上,區(qū)別是大文件調用绸栅,返回文件編碼级野。filepath是個文件
  • change_to_utf8(filepath) : 解決目錄下所有文件,亂碼的情況粹胯。不管是csv還是文本還是2進制文件蓖柔。filepath是個文件夾
  • clear_dir(filepath, save_dir=True):將目錄清空,save_dir=False表示這個目錄刪除
  • file_backups(old_dir, new_dir): 目錄整體備份风纠,從old_dir,備份到new_dir文件夾
# -*- coding: utf-8 -*-
"""
===========================
# @Time : 2020/8/5 16:39
# @File  : handele_file.py
# @Author: adeng
# @Date  : 2020/8/5
============================
"""

import chardet
import os
from datetime import datetime


class HanldeFile():
    pass
    """
    file_encoding:函數(shù)返回文件編碼
    file_encoding_big 處理大文件返回文件編碼

    """
    @staticmethod
    def file_encoding(filepath):
        """
        filepath: 文件的路徑况鸣,非目錄
        返回的是一個文件的編碼格式
        """
        if not os.path.isfile(filepath):
            print("這不是一個文件")
            return
        with open(filepath, "rb") as f1:
            data = f1.read()
            # {'encoding': 編碼, 'confidence': 可信度, 'language': 語言}
            result = chardet.detect(data)
            print(result)
            encoding = result.get("encoding")
        return encoding

    @staticmethod
    def file_encoding_big(filepath):
        """
        對大文件獲取encoding的處理方式
        """
        if not os.path.isfile(filepath):
            print("這不是一個文件")
            return
        # 默認一個字典的key為None
        dict_encoding = dict(encoding=None)
        list_encod = []
        bytess = 0
        with open(filepath, mode="rb") as f:
            for i in range(50):  # 對大文件讀取50次
                data = f.read(6000)
                bytess += 1
                if len(data) == 0:
                    break
                res = chardet.detect(data)
                encoding = res.get("encoding")
                if not encoding:
                    continue
                list_encod.append(encoding)
        print(list_encod)
        if len(list_encod) == 1 and len(list_encod) != 0:
            dict_encoding["encoding"] = list_encod[-1]
        elif bytess == 1:  # 這里表示打開讀取文件內容為空,看上面的for循環(huán)只讀了一次竹观。
            print("此文件為空镐捧,刪除文件重新創(chuàng)建一個編碼為【utf-8】的同文件名")
            t = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')
            os.remove(filepath)
            with open(filepath, mode="w", encoding="utf-8") as new_file:
                pass
            dict_encoding["encoding"] = new_file.encoding
        if len(list_encod) > 1:
            list_des = list(set(list_encod))  # 去重
            count_dict = {}
            for i in list_des:
                num = list_encod.count(i)
                count_dict.setdefault(num, i)  # 不存在就新增到字典
            print(count_dict)
            # sorted()排序
            res_list = sorted(count_dict, key=lambda k: k, reverse=True)
            dict_encoding["encoding"] = count_dict[res_list[0]]
        return dict_encoding["encoding"]

    @staticmethod
    def change_to_utf8(filepath):
        """
        # 處理文件目錄文件亂碼的
        """
        if not os.path.isdir(filepath):
            print(f"{filepath}這不是一個目錄")
            return
        for root, dirs, files in os.walk(filepath):
            pass

            for f in files:
                old_path = os.path.join(root, f)
                t = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')
                write_path = os.path.join(root, f"{t}" + f)
                try:
                    with open(old_path, mode="r", encoding=HanldeFile.file_encoding_big(old_path)) as read_old:
                        data = read_old.read()
                        with open(write_path, mode="w", encoding="utf8") as write_new:
                            write_new.write(data)
                    # 刪除原文件,寫入的新文件重命名為原文件
                    os.remove(old_path)
                    os.rename(write_path, old_path)
                except Exception as e:
                    with open(old_path, mode="rb") as read_old1:
                        pass
                        with open(write_path, mode="wb") as write_new1:
                            write_new1.write(read_old1.read())
                    # 刪除原文件臭增,寫入的新文件重命名為原文件
                    os.remove(old_path)
                    os.rename(write_path, old_path)

    @staticmethod
    def clear_dir(filepath, save_dir=True):
        """
        清空目錄包括子目錄
        """
        if not os.path.isdir(filepath):
            print(f"{filepath}這不是一個目錄")
            return
        # 目錄(包括子目錄)下所有文件刪除,目錄保留
        for root, dirs, files in os.walk(filepath):
            for f in files:
                old_path = os.path.join(root, f)
                os.remove(old_path)
        # 下面代碼是為了刪除目錄
        if not save_dir:
            list_dir = []
            for root, dirs, files in os.walk(filepath):
                if not dirs:
                    list_dir.append(root)
                    continue
            print(list_dir)
            # 對空文件夾按層級目錄刪除懂酱,os.removedirs(path)
            for f1 in list_dir:
                os.removedirs(f1)

    @staticmethod
    def file_backups(old_dir, new_dir):
        """
        備份,ole_dir:原來的文件夾誊抛,new_dir:備份后的文件夾
        """
        if not os.path.isdir(old_dir):
            print(f"傳入的{old_dir}不是一個目錄")
            return
        for root, dirs, files in os.walk(old_dir):
            new_root = root.replace(old_dir, new_dir)
            if not os.path.exists(new_root):
                os.mkdir(new_root)
            # # 創(chuàng)建對應的文件夾.注釋的代碼可不要用來理解的
            # for dir in dirs:
            #     dir = os.path.join(new_root, dir)
            #     if not os.path.exists(dir):
            #         os.mkdir(dir)
            # 取出所有文件列牺,打開文件,重新寫入
            for f in files:
                old_filename = os.path.join(root, f)
                new_filename = os.path.join(new_root, f)
                with open(old_filename, mode="rb") as f1, open(new_filename, "wb") as f2:
                    for line in f1:
                        f2.write(line)


if __name__ == '__main__':
    pass

上面代碼已經(jīng)測試過芍锚,測試過程我就不發(fā)了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末昔园,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子并炮,更是在濱河造成了極大的恐慌,老刑警劉巖甥郑,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逃魄,死亡現(xiàn)場離奇詭異,居然都是意外死亡澜搅,警方通過查閱死者的電腦和手機伍俘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門邪锌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人癌瘾,你說我怎么就攤上這事觅丰。” “怎么了妨退?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵妇萄,是天一觀的道長。 經(jīng)常有香客問我咬荷,道長冠句,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任幸乒,我火速辦了婚禮懦底,結果婚禮上,老公的妹妹穿的比我還像新娘罕扎。我一直安慰自己聚唐,他們只是感情好,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布腔召。 她就那樣靜靜地躺著杆查,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宴咧。 梳的紋絲不亂的頭發(fā)上根灯,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機與錄音掺栅,去河邊找鬼烙肺。 笑死,一個胖子當著我的面吹牛氧卧,可吹牛的內容都是我干的桃笙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼沙绝,長吁一口氣:“原來是場噩夢啊……” “哼搏明!你這毒婦竟也來了?” 一聲冷哼從身側響起闪檬,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤星著,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粗悯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虚循,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了横缔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铺遂。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茎刚,靈堂內的尸體忽然破棺而出襟锐,到底是詐尸還是另有隱情,我是刑警寧澤膛锭,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布粮坞,位于F島的核電站,受9級特大地震影響泉沾,放射性物質發(fā)生泄漏捞蚂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一跷究、第九天 我趴在偏房一處隱蔽的房頂上張望姓迅。 院中可真熱鬧,春花似錦俊马、人聲如沸丁存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽解寝。三九已至,卻和暖如春艘儒,著一層夾襖步出監(jiān)牢的瞬間聋伦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工界睁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留觉增,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓翻斟,卻偏偏與公主長得像逾礁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子访惜,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359