实战:文件处理:获取编码,解决乱码,备份目录,清空文件

处理文件

  • file_encoding(filepath) :小文件的时候调用,获取文件的编码,可以传入open()函数encoding参数。filepath是个文件
  • file_encoding_big(filepath) :同上,区别是大文件调用,返回文件编码。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:函数返回文件编码
    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循环只读了一次。
            print("此文件为空,删除文件重新创建一个编码为【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)
            # # 创建对应的文件夹.注释的代码可不要用来理解的
            # 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

上面代码已经测试过,测试过程我就不发了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335