用Python3做开发中的小任务

准备工作(可选,mac环境)

安装Homebrew
安装python3
设置默认python
安装python编辑器Sublime3

用Python检查资源文件是否Valid

有时候编译打包时会报资源文件格式错误。比如某个jpg的文件被重命名为png, 然后放到了图片资源目录下,就可能导致编译失败。
为此写了一个Python脚本来自动检测此类错误。

# -*- coding: utf-8 -*-
import os
import imghdr

PATH = r"/Users/apple/Desktop"
pngString = "png"
for path, dirs, files in os.walk(PATH):
    for filename in files:
        fullpath = os.path.join(path, filename)
        format = imghdr.what(fullpath)
        if format != pngString:
           print(fullpath)

PATH 是要检测的路径名,walk方法会遍历改PATH下的所有文件,包括子文件夹下的文件。然后检测真实的格式(format)(即使重命名过也没事)。最后如果格式不是png,就会打印出文件名。

使用方法:

  1. 文本编辑器复制这段代码,保存为.py结尾的文件。
  2. 改成自己的检测路径
  3. 在命令行中运行,比如python /Users/apple/Desktop/imgcheck.py 即可

批量重命名图片并复制到drawable文件夹

带注释的脚本:

# -*- coding: utf-8 -*-
import os
import shutil

# 从哪里拷贝图片
pathFrom = input("move drawable from:").strip()
# 拷贝到哪个文件夹  比如项目下的drawable—xhdpi文件夹
pathTo = input("move drawable to:").strip()
# 要批量重命名的字符串 一般是@2x。也是需要复制的图片的标志,因为如果不需要重命名的话,就直接复制 不需要脚本了。
iDentifyString = input("iDentifyString:").strip()
for path, dirs, files in os.walk(pathFrom):
    for fileName in files:
        print(fileName)
        if iDentifyString.lower() in fileName.lower():
            fromFullpath = os.path.join(path, fileName)
            # 去掉@2x 替换不合法方字符 改成小写
            newFileName = fileName.replace(
                iDentifyString, "").replace("-", "_").lower()
            print(newFileName)
            toFullPath = os.path.join(pathTo, newFileName)
            shutil.copyfile(fromFullpath, toFullPath)

使用场景:UI给了切图,但是是按IOS命名的。@2x @3x 这样。安卓只需要拿@2x的图片,并去掉@2x这几个字符。

批量重命名

windows系统没有提供批量重命名的工具,就自己用写了个脚本:

import re

# 从哪里拷贝文件
pathFrom = input("move file from:").strip()
# 拷贝到哪个文件夹  目前是新建rename文件夹
pathTo = os.path.join(pathFrom, "rename")
if not os.path.exists(pathTo):
    os.makedirs(pathTo)
# 要批量重命名的字符串
iDentifyString = "_sign"
for path, dirs, files in os.walk(pathFrom):
    for fileName in files:
        # 没有重命名的文件也复制
        newFileName = fileName
        fromFullpath = os.path.join(path, fileName)
        if iDentifyString.lower() in fileName.lower():
            # 去掉iDentifyString
            newFileName = fileName.replace(
                iDentifyString, "")
            newFileName = re.sub(r'(_(\d{1,3}))+_', r'_', newFileName)
            print(newFileName)
        toFullPath = os.path.join(pathTo, newFileName)
        #如果不是rename文件夹下的文件
        if not "rename" in fromFullpath:
            shutil.copyfile(fromFullpath, toFullPath)

这样,文件名 appName_1.1.1_111_1_qq_sign.apk 就会重命名为 appName_1.1.1_qq.apk

bug解决

使用zipFile压缩文件时, 发现中文的文件名会乱码, 搜索无果,就自己调试, 最后发现zipfile.py中执行_encodeFilenameFlags方法时, 没有执行utf-8编码.
(具体原因没时间去探究,就通过改源码的方式解决了, 毕竟就我的日常操作而言,执行UTF-8编码是没有问题的)
原来的代码:

def _encodeFilenameFlags(self):
        if isinstance(self.filename, unicode):
            try:
                return self.filename.encode('ascii'), self.flag_bits
            except UnicodeEncodeError:
                return self.filename.encode('utf-8'), self.flag_bits | 0x800
        else:
            return self.filename, self.flag_bits

修改后代码:

def _encodeFilenameFlags(self):
        if isinstance(self.filename, unicode):
            try:
                return self.filename.encode('ascii'), self.flag_bits
            except UnicodeEncodeError:
                return self.filename.encode('utf-8'), self.flag_bits | 0x800
        else:
            return self.filename.encode('utf-8'), self.flag_bits | 0x800

分文件夹脚本

(某文件夹有两千多张照片, 翻页会卡, 就平均分割成多个文件夹,方便查看):

# -*- coding: utf-8 -*-
import os
import imghdr
import shutil

currentIndex = 0
currentPath = ""
        # 从哪里拷贝
currentFolderIndex = 0        
pathFrom = input("move from:").strip().lstrip('\"').rstrip('\"').lstrip('\'').rstrip('\'')
# 拷贝到哪个文件夹
pathTo = input("move to:").strip().lstrip('\"').rstrip('\"').lstrip('\'').rstrip('\'')
print(pathFrom)
currentPath = os.path.join(pathTo, str(currentFolderIndex))
os.mkdir(currentPath)
for path, dirs, files in os.walk(pathFrom):
    for fileName in files:
        print(fileName)
        if currentIndex >= 100:
            currentIndex = 0
            currentFolderIndex += 1
            currentPath = os.path.join(pathTo, str(currentFolderIndex))
            os.mkdir(currentPath)

        fromFullpath = os.path.join(path, fileName)
        # print(newFileName)
        toFullPath = os.path.join(currentPath, fileName)
        shutil.copyfile(fromFullpath, toFullPath)
        currentIndex += 1

帮算法组写的整理数据的功能(文件输入 字符串搜索 遍历数组)

# -*- coding: utf-8 -*-
import os
import imghdr
import shutil


def read_file_as_str(file_path):
    if not os.path.isfile(file_path):
       raise TypeError(file_path + " does not exist")
    all_the_text = open(file_path).read()
    return all_the_text


errorDataFileLocation = input("errorDataFileLocation:").strip().lstrip('\"').rstrip('\"').lstrip('\'').rstrip('\'')
errorDataListStr = read_file_as_str(errorDataFileLocation)
dataSourceFileLocation = input("dataSourceFileLocation:").strip().lstrip('\"').rstrip('\"').lstrip('\'').rstrip('\'')
dataSourceStr = read_file_as_str(dataSourceFileLocation)
dataSource = dataSourceStr.replace(".pts", "").replace("\n", "").split("./");
print("items start")
for item in dataSource:
    if item in errorDataListStr:
        errorDataListStr = errorDataListStr.replace(item, "")
        print("./" + item + ".jpg")
print("items end")
print("errorDataListStr")
print(errorDataListStr.strip())

你可能感兴趣的:(用Python3做开发中的小任务)