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

用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,就会打印出文件名。

使用方法:

文本编辑器复制这段代码,保存为.py结尾的文件。

改成自己的检测路径

在命令行中运行,比如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())