目录
1】关于python的“入口函数”
python没有像大多数语言那样有一个Main()入口函数,python脚本的执行会依次执行脚本内的每行代码(除def后定义的函数外)。
那有些人会问,python里面的 if name == “main”: 是怎么回事?看下面的一个
hello.py:
print("001")
#自定义一个方法
def sayName():
print("003,__name__ is " + __name__)
if __name__ == "__main__":
print ("002,__name__ is " + __name__)
sayName() #调用自定义的方法
运行结果:
001
002,__name__ is __main__
003,__name__ is __main__
代码中的__name__只是python的一个内置属性,代表当前python文件被调用的方式。如果python脚本是被自己调用的,该值就是__main__。而如果是其他模块import了自己,这个值就是自己的名字(hello),看下面的代码:
computer.py:
print("004")
import hello
print("005")
if __name__ == "__main__":
print("006,__name__ is " + __name__)
hello.sayName()
print("007,__name__ is " + __name__)
运行结果:
004
001
005
006,__name__ is __main__
003,__name__ is hello
007,__name__ is __main__
computer.py 执行到import hello时,会进入hello.py内运行程序,输出001,但是此时hello.py的 name 因为是外部调用,所以__name__ == hello,不满足
== " main " 的条件(因文本编译原因main两边的下划线没显示出来),不再执行hellp.py后续内容。
2】python 简单的字符串替换
需求:删除文本文件中所有的0-9,并统一在末尾添加0-9。
parseFont.py
# -*- coding: utf-8 -*-
'''
Usage:
Add all specific characters in the text to the end after deduplication
用法:
将文本内的特定字符去重后添加到末尾
'''
import os
#要处理的文件名称
fixFileName = "Fonts.txt"
#需要删掉的字符
removeStr = ["0","1","2","3","4","5","6","7","8","9"]
#需要新增的字符
addStr = "0123456789"
#定义重新生成文本的方法
def RegenerateTextFiled():
oldFile = os.path.join("./", fixFileName) #python拼接路径用join
print("fixFilePath : " + oldFile) #打印一下路径
with open(oldFile, 'r') as f: #打开文件,只读
text = f.read() #获取文本内容
print("old text:%s"%text) #打印一下最开始的文本内容
for rs in removeStr: #遍历需要去除的字符数组
if rs in text: #如果文本内存在
text = text.replace(rs, "") #替换掉
print("new text:%s"%text) #再打印下文本
text += addStr #将需要添加的字符串拼接上
print("final text:%s"%text) #再打印下添加后的文本
with open(oldFile, 'w') as f: #打开文件,写
f.write(text) #写入文本内容
#自定义Main()方法
def Main():
RegenerateTextFiled() #调用我们定义的方法
#执行Main()方法,注意:python脚本内的代码会依次执行
#(除def后定义的函数外,所以,执行到这里就走入Main()方法中了,并非python自带的入口函数)
Main()
运行结果:
fixFilePath : ./Fonts.txt
old text:哈1哈2哈3哈哈4哈哈5哈哈哈哈哈6哈哈8哈哈1哈哈2哈哈3哈哈4
new text:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
final text:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈0123456789
3】python 模块之间的调用
需求同上,我们稍微加入类和模块的内容,看代码:
myPython.py
# -*- coding: utf-8 -*-
'''
Usage:
Introduce a custom module and call its methods
用法:
引入自定义模块,并调用其中的方法
'''
import os
import parseFont #引入上文中我们的parseFont模块
print("--------------------------------------------------------------------------------------------------------")
#定义一个FontManager类
class FontManager:
def __init__(self,name): #定义类的初始化方法(必须带self,代表类的实例),如果想在初始化的时候传参,例如name
print("class FontManager init success, param is :" + name)
self.name = name
#定义一个方法,必须带有self
def RegenerateFile(self):
print("self.name is :" + self.name) #使用传进来的参数
parseFont.RegenerateTextFiled() #调用parseFont模块内的RegenerateTextFiled方法
#自定义Main()方法
def Main():
font = FontManager("fontInstance") #传参name,如果没有参数,注意必须带有(),否则系统不认为是class
font.RegenerateFile() #调用FontManager类中的RegenerateFile方法
#执行Main()方法
Main()
运行结果:
fixFilePath : ./Fonts.txt
old text:哈11111哈哈哈222222222哈哈哈4444444哈哈哈哈哈哈5555哈哈哈哈哈哈哈哈哈
new text:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
add text:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈0123456789
--------------------------------------------------------------------------------------------------------
class FontManager init success, param is :fontInstance
self.name is :fontInstance
fixFilePath : ./Fonts.txt
old text:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈0123456789
new text:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
add text:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈0123456789
有小伙伴注意到,parseFont.py内的regenarateTextFiled()方法执行了两次。还记得上文说过,python代码依次执行吗,import parseFont 进入parseFont.py方法也会执行一遍。
4】python 文本内删除特定字符串的行数据
当我们有大量日志,需要筛掉无用的日志的时候,可以根据每行日志里的特定字符进行筛选,直接上代码
import os
oldFilePath = "originalLog.txt"
NewFilePath = "newLog.txt"
mathcStr = "inner_order_id is invalid!"
def removeSucess():
with open(oldFilePath, 'r') as f: //读取源日志数据
lines = f.readlines()
with open(NewFilePath, 'w') as w:
for l in lines: //遍历源数据,根据匹配字符串,写入新文件
if mathcStr in l:
w.write(l)
if __name__ == "__main__":
removeSucess()
5】python 解析json数据
config.json内容
{
"zhangsan":{
"name": "zhangsan",
"age": "13",
}
}
解析示例
import json
#load json data
def LoadSDKConfig(MainKey):
sdkConfigPath = os.path.join(os.getcwd(), "./config.json")
#if not os.path.isfile(sdkConfigPath):
# print("not have sdkConfigPath:%s"%sdkConfigPath)
# exit()
f = open(sdkConfigPath, 'r')
setting = json.load(f) #load json data
if MainKey in setting:
moduleConfig = setting[MainKey] #第一层
# print("moduleConfig:%s"%moduleConfig)
return moduleConfig
else:
print("not found setting, MainKey: %s"%MainKey)
def UseJsonConfig():
config = LoadSDKConfig("zhangsan")
for key in config:
print("key:%s"%key) #第二层,打印key
print("value:%s"%config[key]) #第二层,打印value
if __name__ == "__main__":
UseJsonConfig()
6】python os相关操作
import os
def operateOS():
oldPath = os.getcwd() + "/first/111.txt"
newPath = os.getcwd() + "/second/222.txt"
#修改文件名称以及路径, 操作等同于将111.txt剪贴,复制到second下面,并修改名字为222.txt
os.rename(oldPath, newPath)
7】python 获取apk信息(包名,版本号,版本名称)并重命名apk
import os,re
def changeObbName(packageName, versionCode):
oldName = os.getcwd() + "/water.main.obb"
newName = os.getcwd() + "/main." + versionCode + "." + packageName + ".obb"
if os.path.exists(newName):
os.remove(newName)
if os.path.exists(oldName):
os.rename(oldName, newName) #修改名字以及目录
print("rename obb success: %s" %newName)
# get app packageName, versionCode, versionName return match
def getAppBaseInfo(apk_path):
get_info_commond = "source ~/.bash_profile && aapt dump badging %s " %apk_path #先执行一下source ~/.bash_profile 因为每次启动设置的环境变量都失效,所以先执行下,否则aapt找不到
output = os.popen(get_info_commond).read() #得到的就是包的信息,string类型
match = re.compile("package: name='(\S+)' versionCode='(\d+)' versionName='(\S+)'").match(output) #正则匹配
if not match:
print ("can not get packageinfo")
return match
def changeObbNameByPath(apk_path):
apkInfoMatch = getAppBaseInfo(apk_path)
if apkInfoMatch:
print("apk info: %s" %apkInfoMatch.group())
changeObbName(apkInfoMatch.group(1), apkInfoMatch.group(2))
def Main():
apk_path = os.getcwd() + "rename.apk"
changeObbNameByPath(apk_path)
Main()
8】python 二分查找实现
知识点:
1】二分查找
2】取数组长度 ,len(arr)
3】强转int , int(num)
4】三目运算符 , m = 3 if a < b else 4
5】类方法的调用
# -*- coding:utf-8 -*-
"""
二分查找升序数组内某个值
"""
import os
import sys
class Solution(object):
def search(self, nums, left, right, target):
#找完了 return -1
if left > right:
return -1
#就剩一个了,直接判断
if left == right:
return left if nums[left] == target else -1
#转换int int()
mid = ( int(left) + int(right)) /2
if nums[mid] == target:
return mid
#调用方法需要用self调用, 不用传入self
return self.search(nums, 0, mid-1, target) if nums[mid] > target else self.search(nums, mid+1, right, target)
def Search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
#调用方法需要用self调用, 不用传入self
#计算数组长度 len()
return self.search(nums, 0, len(nums), target)
def main():
#实例化类
ca = Solution()
#测试数据
nums = [1,2,3,7,9,10]
#调用类的方法
result = ca.Search(nums, 9)
print result
main()