批量替换文本内容,并自动转换文件编码

from tempfile import mkstemp
from shutil import move
from os import fdopen, remove
import os
from chardet.universaldetector import UniversalDetector

patterns = [
    "android.support.v7.app.AppCompatActivity",
    "android.support.v4.app.ActivityCompat",
    "android.support.v7.widget.Toolbar",
    "android.support.v4.content.FileProvider",
    "android.support.v4.content.ContextCompat"
]

corresponding = [
    "androidx.appcompat.app.AppCompatActivity",
    "androidx.core.app.ActivityCompat",
    "androidx.appcompat.widget.Toolbar",
    "androidx.core.content.FileProvider",
    "androidx.core.content.ContextCompat"
]


def get_encode_info(file):
    with open(file, 'rb') as f:
        detector = UniversalDetector()
        for line in f.readlines():
            detector.feed(line)
            if detector.done:
                break
        detector.close()
        return detector.result['encoding']

def read_file(file):
    with open(file, 'rb') as f:
        return f.read()
 
def write_file(content, file):
    with open(file, 'wb') as f:
        f.write(content)

def conver(file, original_encode, des_encode):
    file_content = read_file(file)
    file_decode = file_content.decode(original_encode,'ignore')
    file_encode = file_decode.encode(des_encode)
    write_file(file_encode, file)


def replace(file_path, pattern, subst):
    encode_info = get_encode_info(file_path)
    print(encode_info)
    if encode_info != 'UTF-8':
        print("换")
        conver(file_path, encode_info, 'UTF-8')
    #Create temp file
    fh, abs_path = mkstemp()
    with fdopen(fh,'w', encoding='UTF-8') as new_file:
        with open(file_path,'r', encoding='UTF-8') as old_file:
            for line in old_file:
                # print(line)
                line = line.replace(pattern, subst)
                new_file.write(line)
    #Remove original file
    remove(file_path)
    #Move new file
    move(abs_path, file_path)


for root, dirs, files in os.walk('C:\\Users\\ASUS\\Desktop\\try\\network\\src\\main\\java\\com\\example\\network', topdown=False):
    print(root.split('\\')[-1], '下java文件个数', len(files))
    for file in files:
        full_path = (root+'\\'+file).replace('\\', '\\\\')
        print(full_path)
        for i in range(len(patterns)):
            replace(full_path, patterns[i], corresponding[i])

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值