7.18コレクションランダムOS sysのモジュール
収集モジュール
アプリケーションシナリオ1
# 具名元组
# 想表示坐标点x为1 y为2 z为5的坐标
from collections import namedtuple
# point = namedtuple('坐标',['x','y','z']) # 第二个参数既可以传可迭代对象
point = namedtuple('坐标','x y z') # 也可以传字符串 但是字符串之间以空格隔开
p = point(1,2,5) # 注意元素的个数必须跟namedtuple第二个参数里面的值数量一致
print(p)
print(p.x)
print(p.y)
print(p.z)
>>>
坐标(x=1, y=2, z=5)
1
2
5
from collections import namedtuple
city = namedtuple('天津','location person job')
c = city('剧院','岳云鹏','相声')
print(c)
print(c.location)
print(c.person)
print(c.job)
シナリオ2
from collections import namedtuple
card = namedtuple('扑克牌','color number')
# card1 = namedtuple('扑克牌',['color','number'])
A = card('♠','A')
print(A)
print(A.color)
print(A.number)
>>>
扑克牌(color='♠', number='A')
♠
A
キューキュー:先入れ先出し(FIFO先入れ先出しで)
import queue
q = queue.Queue() # 生成队列对象
q.put('first') # 往队列中添加值
q.put('second')
q.put('third')
print(q.get()) # 朝队列要值
print(q.get())
print(q.get())
print(q.get()) # 如果队列中的值取完了 程序会在原地等待 直到从队列中拿到值才停止
両端キュー両端キュー
from collections import deque
q = deque(['a','b','c'])
"""
之前学习过的方法
append
appendleft
pop
popleft
"""
q.append(1)
q.appendleft(2)
"""
队列不应该支持任意位置插值
只能在首尾插值(不能插队)
"""
q.insert(2,'哈哈哈') # 特殊点:双端队列可以根据索引在任意位置插值
print(q.pop())
print(q.popleft())
print(q.popleft())
注文した辞書OrderedDict
辞書を使用する場合は、キーが無秩序です。辞書の反復が実行すると、我々はキーの順序を決定することはできません。
あなたがキーシーケンスを維持したい場合は、OrderedDict使用することができます。
normal_d = dict([('a',1),('b',2),('c',3)])
print(normal_d)
from collections import OrderedDict
order_d = OrderedDict([('a',1),('b',2),('c',3)])
order_d1 = OrderedDict()
order_d1['x'] = 1
order_d1['y'] = 2
order_d1['z'] = 3
print(order_d1)
for i in order_d1:
print(i)
# print(order_d1)
# print(order_d)
order_d1 = dict()
order_d1['x'] = 1
order_d1['y'] = 2
order_d1['z'] = 3
print(order_d)
for i in order_d:
print(i)
#OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:
defaultdict
値の次のセットを持っている[11,22,33,44,55,66,77,88,99,90 ...]、66より大きいすべての値が辞書の最初のキーに保存され、値は以下の66になります第2のキーに格納された値です。
# 普通dict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = {}
for value in values:
if value>66:
if my_dict.has_key('k1'):
my_dict['k1'].append(value)
else:
my_dict['k1'] = [value]
else:
if my_dict.has_key('k2'):
my_dict['k2'].append(value)
else:
my_dict['k2'] = [value]
# defaultdict
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
カウンタ
カウンタオブジェクトクラスは、発生値の数を追跡するために使用されます。それは、そのカウント値としてキー、などの要素辞書に格納されたキーと値のペアの形式で、容器の順序付けられていないタイプです。カウント値が(0と負の数を含む)任意Intergerであってもよいです。カウンターのクラスや他の言語のバッグやマルチセットに非常に似ています。
c = Counter('abcdeabcdabcaba')
print c
输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
時間モジュール
そして、時間が、我々は時間のモジュールを使用する関係を持っています。モジュールを使用する前に、まずこのモジュールをインポートする必要があります。
#常用方法
1.time.sleep(secs)
(线程)推迟指定的时间运行。单位为秒。
2.time.time()
获取当前时间戳
3つの方法が時間を表し、
タイムスタンプタプル(するstruct_time)、フォーマットされたタイム・ストリング:Pythonで、時間を表現する3つの方法が一般的にあります。
(1)タイムスタンプ(タイムスタンプ):一般的に言って、タイムスタンプは1970年1月から夜12時〇〇分00秒第一は、秒単位でプレスをオフセットことを示しています。私たちは、 "タイプは(time.time())"、floatを返す実行します。
(2)フォーマットされた時刻文字列(書式文字列):「1999年12月6日
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
(3)タプル(なstruct_time):9つの要素のタプルなstruct_timeの合計は、9つの要素でした:(年、月、日、時、分、秒、年の最初の数週間、年などの日)
#导入时间模块
>>>import time
#时间戳
>>>time.time()
1500875844.800804
#时间字符串
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 13:54:37'
>>>time.strftime("%Y-%m-%d %H-%M-%S")
'2017-07-24 13-55-04'
#时间元组:localtime将一个时间戳转换为当前时区的struct_time
time.localtime()
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24,
tm_hour=13, tm_min=59, tm_sec=37,
tm_wday=0, tm_yday=205, tm_isdst=0)
要約:コンピュータは、時間のタイムスタンプを識別することができる、時間列は、1つの時間を読み取ることができるであるタプルは、時間を操作するために使用され
いくつかのフォーマット間の変換
randomモジュール
# 随机模块
import random
print(random.randint(1,6)) # 随机取一个你提供的整数范围内的数字 包含首尾
print(random.random()) # 随机取0-1之间小数
print(random.choice([1,2,3,4,5,6])) # 摇号 随机从列表中取一个元素
res = [1,2,3,4,5,6]
random.shuffle(res) # 洗牌
print(res)
# 生成随机验证码
"""
大写字母 小写字母 数字
5位数的随机验证码
chr
random.choice
封装成一个函数,用户想生成几位就生成几位
"""
def get_code(n):
code = ''
for i in range(n):
# 先生成随机的大写字母 小写字母 数字
upper_str = chr(random.randint(65,90))
lower_str = chr(random.randint(97,122))
random_int = str(random.randint(0,9))
# 从上面三个中随机选择一个作为随机验证码的某一位
code += random.choice([upper_str,lower_str,random_int])
return code
res = get_code(4)
print(res)
osモジュール
osモジュール:モジュールは、オペレーティングシステムを扱います
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command).read() 运行shell命令,获取执行结果
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.path
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
SYSモジュール
SYSモジュール:Pythonインタプリタモジュールを扱います
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
シーケンシングモジュール
シーケンス:文字列
序列化:其他数据类型转换成字符串的过程
写入文件的数据必须是字符串
基于网络传输的数据必须是二进制
序列化:其他数据类型转成字符串的过程
反序列化:字符串转成其他数据类型
json模块(IMPORTANT)
所有的语言都支持json格式
支持的数据类型很少 字符串 列表 字典 整型 元组(转成列表) 布尔值
pickle模块(****)
只支持python
python所有的数据类型都支持
json实例
import json
d = {"name":"jason"}
print(d)
res = json.dumps(d) # json格式的字符串 必须是双引号 >>>: '{"name": "jason"}'
print(res,type(res))
res1 = json.loads(res)
print(res1,type(res1))
import json
d = {"name":"jason"}
with open('userinfo','w',encoding='utf-8') as f:
json.dump(d,f) # 装字符串并自动写入文件
with open('userinfo','r',encoding='utf-8') as f:
res = json.load(f)
print(res,type(res))
import json
with open('userinfo','w',encoding='utf-8') as f:
json.dump(d,f) # 装字符串并自动写入文件
json.dump(d,f) # 装字符串并自动写入文件
with open('userinfo','r',encoding='utf-8') as f:
res1 = json.load(f) # 不能够多次反序列化
res2 = json.load(f)
print(res1,type(res1))
print(res2,type(res2))
import json
d1 = {'name':'刘德华'}
print(json.dumps(d1,ensure_ascii=False))
pickle实例
# pickle
import pickle
d = {'name':'jason'}
res = pickle.dumps(d) # 将对象直接转成二进制
print(pickle.dumps(d))
res1 = pickle.loads(res)
print(res1,type(res1))
"""
用pickle操作文件的时候 文件的打开模式必须是b模式
"""
with open('userinfo_1','wb') as f:
pickle.dump(d,f)
with open('userinfo_1','rb') as f:
res = pickle.load(f)
print(res,type(res))
subprocess模块
sub :子
process:进程
while True:
cmd = input('cmd>>>:').strip()
import subprocess
obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
# print(obj)
print('正确命令返回的结果stdout',obj.stdout.read().decode('gbk'))
print('错误命令返回的提示信息stderr',obj.stderr.read().decode('gbk'))