准备工作(可选,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())