Python模块实质为py文件,Python在importpy模块时默认会在sys.path所包含的路径中去寻找,搜索失败时会出错。
假设有一个module.py文件,代码如下:
var=1
def func():
print("module function")
在同一路径中有一个test.py文件,代码如下:
import module #在sys.path中搜索module.py文件
print(module.var)
module.func()
import整个文件实质上会将module.py中的所有代码解释一遍,并将结果以文件名同名变量返回,返回结果可理解为是一个对象,因为调用模块中的成员需要用’模块名.成员’的形式。
#直接导入对应的代码部分,相当于代码复制
from module import var,func
print(var)
func()
# 与导入代码同名会产生覆盖
var=2
def func():
print("test funtion")
print(var)
func()
Python中包是指包含多个可调用模块的文件夹,除了可调用模块外,包默认包含一个特殊的__init__.py文件,这个文件中的代码在包被导入时会自动执行。
__init__.py:
print("package __init__.py running...")
from . import package_file_1
from . import package_file_2
package_file_1.py:
def package_func_1():
print("package function_1 running...")
package_file_2.py:
def package_func_2():
print("package function_2 running...")
test.py:
import package #在导入包的时候会执行__init__.py中的代码
package.package_file_1.package_func_1()
package.package_file_2.package_func_2()
假设项目目录结构如下图所示,func为项目执行入口,配置程序与主程序均在func中被调用。
settings.py代码:
def settings():
print("settings running...")
main.py代码:
def main():
print("main running...")
func.py代码:
import os
#获取本文件所在绝对路径,往上返回两层得到项目路径
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
import sys
sys.path.append(BASE_DIR)
from conf import settings
settings.settings()
from core import main
main.main()
import time
Python支持三种格式的时间:时间戳、元组和字符串,三种时间格式之间可以相互转换。
time():返回以秒为单位的当前时间戳。
time.time()
输出为:1511520388.6707194
gmtime()与localtime():分别将时间戳转换为元组格式的UTC时间与当地时间。
print(time.gmtime(time.time()))
print(time.localtime(time.time()))
输出为:
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=24, tm_hour=10, tm_min=47, tm_sec=42, tm_wday=4, tm_yday=328, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=24, tm_hour=18, tm_min=47, tm_sec=42, tm_wday=4, tm_yday=328, tm_isdst=0)
mktime():将元组格式转换成时间戳。
time.mktime(time.localtime(time.time()))
输出为:1511520462.0
asctime()与ctime():分别将元组格式和时间戳转换成字符串。
time.asctime(time.localtime(time.time()))
time.ctime(time.time())
输出均为:’Fri Nov 24 18:47:42 2017’
strftime():将元组格式转换成指定格式的字符串。
time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
输出为:’2017-11-24 18:47:42’
strptime():将字符串一指定格式转换成元组格式。
time.strptime('2017-11-24 18:47:42',"%Y-%m-%d %H:%M:%S")
输出为:time.struct_time(tm_year=2017, tm_mon=11, tm_mday=24, tm_hour=18, tm_min=47, tm_sec=42, tm_wday=4, tm_yday=328, tm_isdst=-1)
import random
random.seed(42)
Python的random模块实现了一个伪随机数生成器,若未指定随机数种子,会默认使用系统的当前时间。
输出为:0.7364712141640124
uniform():在范围内产生随机浮点数。
random.uniform(0,1)
输出为:0.6498780576394535
randrange():在range范围内产生随机整数。
random.randrange(0,10)
输出为:6
choice():在可迭代对象中随机选取元素。
random.choice("abcdefg")
输出为:’c’
sample():在可迭代对象中进行无放回的随机采样。
random.sample("abcdefg",2)
输出为:[‘g’, ‘b’]
shuffle():对序列对象进行内部洗牌(改变序列对象)。
l=[1,2,3,4,5]
random.shuffle(l)
l
输出为:[2, 4, 3, 5, 1]
使用sample()方法可以实现外部洗牌(不改变序列对象)。
l=[1,2,3,4,5]
random.sample(l,len(l))
实现一个验证码生成器。
import random
code_len=4
code=''
for i in range(code_len):
char_or_num=random.randrange(0,2)
if char_or_num:
code+=chr(random.randrange(65,91))
else:
code+=chr(random.randrange(48,58))
print(code)
输出为:3D99
import os
Python的os模块提供了一些系统级操作。
os.getcwd():get current working directory。
os.getcwd()
输出为:’C:\Users\qq435\Desktop\source\python’
os.listdir():返回包含指定目录下所有文件\文件夹的列表。
os.listdir(".")
输出为:[‘.ipynb_checkpoints’, ‘.vscode’, ‘temp.py’, ‘test’, ‘Untitled-1.py’, ‘Untitled.ipynb’, ‘__pycache__’]
os.scandir():返回包含包含指定目录下所有文件\文件夹的迭代器,速度快于os.listdir()。
for item in os.scandir("."):
print(item)
输出为:
'.ipynb_checkpoints'>
'.vscode'>
'temp.py'>
'test'>
'Untitled-1.py'>
'Untitled.ipynb'>
'\__pycache__'>
os.chdir():Change the current working directory。
# os.chdir(r'C:\Users\qq435\Desktop\source')
os.chdir("..")
os.makedirs():递归创建目录,路径存在时会报错。
os.makedirs(r".\test\test\test")
os.rmdir():删除指定目录。
os.rmdir(r".\test\test\test")
os.removedirs():尝试递归删除指定路径的所有非空目录。
os.removedirs(r".\test\test")
注意,如果在”.\test”目录非空的话,那么”.\test”目录不会被删除。
os.remove():删除指定文件。
os.remove(r".\Untitled-1.py")
os.environ:显示环境变量。
os.environ
os.sep:显示当前系统的路径分隔符。
os.sep
输出为:’\’
os.linesep:显示当前系统的行分隔符。
os.linesep
输出为:’\r\n’
os.pathsep:显示当前系统环境变量的路径分隔符。
os.pathsep
输出为:’;’
import re
参考博客
#对指定字符匹配指定次数
re.search('(!){1}',"@#$!").group() #匹配一次'!'
输出为:’!’
#[]字符集,满足字符集中任意字符即可
s1="I love my mommy."
s2="I love my mummy."
print(re.search("(m[ou]mmy){1}",s1).group(),re.search("(m[ou]mmy){1}",s2).group())
输出为:mommy mummy
#匹配数字
re.search("[0-9]{2}","abc123abc").group() #匹配两次数字
输出为:’12’
#[^]字符集取反
re.search("([^a-zA-Z]){3}","@#$aBc$%^").group() #匹配非字母字符
输出为:’@#$’
#".":匹配一次除"\n"之外的所有字符
re.search("(.){2}","\na1@").group()
输出为:’a1’
#"+":最大化匹配
re.search("([a-zA-Z])+","ab12cde").group()
输出为:’ab’
re.search("(.)+","ab12!\n@").group() #最大化匹配除'\n'外的所有字符
输出为:’ab12!’
re.search("a.+e","abdegh").group() #以a开头,多次匹配任意字符,再以e结尾
输出为:’abde’
re.search("a[a-zA-Z]+e","a12eabcde").group() #以a开头,多次匹配字母,再以e结尾
输出为:’abcde’
#"?"匹配某个字符至多一次,与"+"的作用相对应
re.search("1[0-9]?3","123").group() #1与3中间的一个数字可以是缺失的
输出为:’123’
#"{n,m}"指定匹配n到m次
re.search("1[0-9]{1,2}","12345").group() #1开头,再匹配一到两个数字
输出为:’123’
#"|"或条件匹配
re.search("12345|67890",string).group() #匹配12345或67890
输出为:’12345’
#"^"从首个字符开始匹配
#"$"从结束字符开始匹配
#常用于验证字符串的首尾字符
re.search("^<(.)+>$","<123>" ).group()
输出为:
#(?Pstr)对匹配到的字符命名
ID_number="543635198712050040" #捏造一个身份证号
res_dict=re.search("(?P([0-9]){6})(?P([0-9]){8})" ,ID_number).groupdict()
print(res_dict['add_code'],res_dict['birth_code'])
输出为:543635 19871205
匹配反斜杠
re.search("\\\\","3\8").group()
输出为:’\’
#找出所有满足规则的字符
re.findall("([0-9]){1}","1a2b3c")
输出为:[‘1’, ‘2’, ‘3’]
#按指定模式分割字符串
re.split("#+","12###abc#34")
输出为:[‘12’, ‘abc’, ‘34’]
#按照指定模式替换字符
re.sub("(\\\\)+","#","\\代码中的注释")
输出为:’#代码中的注释’
string="1.abc\n2.def\n3.ghi\n"
re.search("^(2.)(.)+",string,flags=re.M).group()
输出为:’2.def’