一、sys库
常用的几个函数:
- sys.argv:实现从程序外部向程序内部传递参数,返回的第一个值是脚本的本身路径
#文件名:lei.py
import sys
print("传递给python脚本的命令行参数:")
num=0
for i in sys.argv:
if num==0:
print("程序本身的路径:")
print(i)
num+=1
else:
print("从程序外部向内传递的参数:\n")
print(i)
num+=1
在pycharm中运行无法测试往程序内部传递参数这个特点,因此打开从,cmd测试:
切换到存放python脚本的文件夹,我这里是E:\pythonProject,然后输入在命令行输入:
python lei.py what
运行结果如下:
2.sys.path:返回在import模块的时候解释器的搜索目录,即去这些目录下找对应的模块
3.sys.exit():退出程序,0是正常退出,退出的时候会引发SystemExit异常,可以通过捕获这个异常做别的操作
import sys
try:
exit(0)
except SystemExit as value:
print(value)
运行结果:
4.sys.version:获取python的版本信息
5.sys.platform:返回操作系统的名称
6.sys.modules:返回导入模块的绝对路径,是一个字典,要查询某个模块的路径,直接用这个模块的名字作为key去搜索这个字典,sys.modules.keys()返回字典的所有key,sys.modules.values()返回这个字典的所有值
7.sys.getdefaultencoding():返回解释器的默认编码
8.sys.getfilesystemencoding():获取内存数据存到文件里的编码
9.sys.stdin/sys.stdout/sys.stderr:标准输入、标准输出、错误输出
标准输入:为解释器 提供输入字符流,一般使用的是input()函数
用法:sys.stdin.readline()从标准输入读一行
标准输出:输出到屏幕,接收print语句产生的输出
用法:sys.stdout.write(),参数是要输出的内容
还有一个sys,stdout.flush:刷新stdout缓冲区,不让程序运行完一次性输出,而是边运行边 输出可以使用这个。
import sys
print('接下来的输入如下:')
name=sys.stdin.readline()
print(name)
运行结果:绿色是输入内容
import sys
print('接下来的输出如下:')
sys.stdout.write('标准输出')
二.os库
常用的几个函数:
1.os.listdir():返回当前目录 下的所有文件,遍历某个文件夹下的所有文件这个操作很有用,还可以配合startwith()和endswith()进行操作
2.os.walk():当函数遇到一个目录,会递归调用这个目录下的子目录,并产生一个元组,元组包含这个目录的路径,这个目录下的子目录的路径,这个目录下文件的绝对路径。
直接调用这个,返回的是一个迭代器,所以我们可以用sorted或者for处理一下,就可以输出我们想要的内容了
文件夹的情况:
import os
# print(sorted(os.walk('E:\\pythonProject')))
for i in os.walk('E:\\pythonProject'):
print(i)
运行结果:
3.os.name:官方解释是返回当前平台,但是返回的是nt,有点不懂
4.os.getcwd()返回当前脚本运行的绝对路径,即脚本保存在那个文件夹下
5.os.remove():删除指定的文件,注意删除目录会报错
6.os.mkdir:在指定的目录下创建目录
7.os.rmdir:删除指定的空目录
8.os.rename(oldname,newname):重命名文件名,也可以更改文件的路径
import os
os.rename(r'E:\pythonProject\1\1.txt',r'E:\pythonProject\2.txt')
9.print(os.environ):获取系统的环境变量,是个items
10.os.system(r’E:\pythonProject\1.py’):打开一个新的shell,比如这段代码保存为22.py,当我运行这句代码的时候,会打开1.py的窗口,也可以打开文件。
三、fileinput库
常用的函数
1.fileinput.input:类似open的readline()函数,但是这个处理大文件的效率更高
文件效果:
import fileinput
print(fileinput.input('1.txt'))
for line in fileinput.input('1.txt'):
print(line)
运行效果:
因为fileinput.input()返回的是一个迭代器,是一行一行 的去读 文件,所以要借助for来输出每一行的结果
2.fileinput.filename:返回当前文件的名称,fileinput.lineno:返回当前已经读取的行的数量,fileinput.filelineno:返回当前读取行的行号,fileinput.isfirstline:检查 是否是第一行,fileinput.isstdin:判断最后一行是否是从stdin获取到的
import fileinput
print(fileinput.input('1.txt'))
print('文件名','\t\t','已经读取行的数量','\t\t','当前行的行号','\t\t','内容','\t\t','是否是第一行','\t\t',
'是否是stdin读取','\t\t')
for line in fileinput.input('1.txt'):
line=line.replace('\n','')
print(fileinput.filename(),'\t\t',fileinput.lineno(),'\t\t',fileinput.filelineno(),
'\t\t',line,'\t\t',fileinput.isfirstline(),'\t\t',fileinput.isstdin(),'\t\t',)
运行结果:
3. fileinput.close:关闭队列
如果把fileinput.close()放在for循环中,则只会输出文本第一行内容就关闭了这个任务,如下
import fileinput
print(fileinput.input('1.txt'))
print('文件名','\t\t','已经读取行的数量','\t\t','当前行的行号','\t\t','内容','\t\t','是否是第一行','\t\t',
'是否是从stdin读取','\t\t')
for line in fileinput.input('1.txt'):
line=line.replace('\n','')
print(fileinput.filename(),'\t\t',fileinput.lineno(),'\t\t',fileinput.filelineno(),
'\t\t',line,'\t\t',fileinput.isfirstline(),'\t\t',fileinput.isstdin(),'\t\t',)
fileinput.close()
运行结果:
4.fileinput.nextfile():关闭当前文件(并不会把第一个for执行完,输出完第一行就执行nextfile操作)进入到下一个文件,输出下一个文件的第一行
import fileinput
for line in fileinput.input('1.txt'):
print(line)
fileinput.nextfile()
for line in fileinput.input('2.txt'):
print(line)
这里有个bug,用fileinput.input读入的文件是中文的话,会报编码错误,还不知道这个怎么解决:
解决办法:设置openhook的参数,,openhook=fileinput.hook_encoded(‘utf-8’),这样就可以读取中文了
import fileinput
# for line in fileinput.input('1.txt'):
# print(line)
# fileinput.nextfile()
for line in fileinput.input('2.txt',openhook=fileinput.hook_encoded('utf-8')):
print(line)
结果:
四、random
1.random()和uniform()返回随机实数
import random
print(random.random()) #默认0-1(含1)的随机实数
print(random.uniform(1,3)) #根据传参,这里是1-3(含3)的随机实数
运行结果:
D:\anaconda\python.exe E:/pythonProject/lei.py
0.0270270409871487
2.386584326947098
Process finished with exit code 0
2.randint()\randrange()\choice()\sample()\choices()
import random
print(random.randint(1,2)) #随机返回1-3(含3)范围内的整数
print(random.randrange(1,10,2)) #随机从range(start,end,step)不含end的结果中选择一个数返回
print(random.choice(range(1,10,2))) #同上
print(random.sample(['year','month','day','hour','min','sed'],k=3)) #从序列中随机抽取k次,不重复抽取同一个数据
print(random.choices(['year','month','day','hour','min','sed'],k=3)) #从序列中随机抽取k次,可重复抽取同一个数据
#所以,在抽取元素大于样本总数时,choices会继续而sample会报错
d=['year','month','day','hour','min','sed']
random.shuffle(d) #打乱序列,在原序列上打乱,返回的none
print(d)
运行结果:
1
9
5
['hour', 'month', 'year']
['min', 'day', 'sed']
['sed', 'day', 'hour', 'month', 'min', 'year']
Process finished with exit code 0
例子
import time
import random
import fileinput
import os
import pprint
# 示例1 随机获取时间
date1=(2020,1,1,0,0,0,-1,-1,-1) #时间元组
time1=time.mktime(date1) #将时间元组转换为秒数
date2=(2021,1,1,0,0,0,-1,-1,-1)
time2=time.mktime(date2)
random_time=random.uniform(time1,time2)
print(time.localtime(random_time)) #将秒数转换为日期元组,跟mktime刚好相反
print(time.asctime(time.localtime(random_time))) #将时间元组转换为字符串
#示例2 掷骰子
num=int(input('掷多少次:'))
face=int(input('有多少面:'))
sum=0
for i in range(num):
sum+=random.randrange(face)+1
print(sum)
#示例3 随机读取文件的多少行
data=list(fileinput.input('1.txt'))
print(random.choice(data))
os.system('1.txt') #打开1.txt这个文件
#示例4 随机发牌
#建立一副扑克牌
values=list(range(1,11))+'JACK QUEEN KING'.split() #牌的大小
suits='diomands clubs hearts spades'.split() #花色
deck=['{} of {}'.format(v,s) for v in values for s in suits]
random.shuffle(deck)
pprint.pprint(deck[:3]) #打印出来的数据结构更加完整,每行为一个数据结构
#发牌
while deck:
print(deck.pop()) #删除列表的数据并返回
如果想调用方法的时候不用加模块,即pprint.pprint这样的话,可以在导入模块的时候from pprint import pprint
shelve库
例子:
重点在modify,shelve返回的不是单纯的映射关系(字典),要做修改必须把值赋给一个中间变量,在这个中间变量的基础上修改之后,再赋给shelve对象的映射,最后保存生效再查询
import shelve
# 一个简单的数据库应用程序
def store_person(db):
pid = input('输入id:')
person = {}
PName = input('输入名字:')
PAge = input('输入年龄:')
PPhone = input('输入电话号码:')
person['name'] = PName
person['age'] = PAge
person['phone'] = PPhone
db[pid]=person
def del_person(db):
pid=input('请输入删除id:')
del db[pid]
def modify_person(db):
pid=input('请输入id:')
while True:
field=input('请输入Name/Age/Phone其中一个:')
mod=input('请输入更正后的内容:')
field=field.strip().lower()
temp=db[pid]
temp[field]=mod
com=input('是否修改完毕(yes/no):')
if com=='yes':
db[pid] = temp
return
def lookup_person(db):
pid=input('请输入id:')
field=input('请输入Name/Age/Phone其中一个:')
field=field.strip().lower()
print(field.capitalize()+':'+db[pid][field]) #capitalize()是首字母大写
def print_help():
print('store_person是添加')
print('lookup_person是查找')
print('modify_person是修改')
print('del_person是删除')
print('?是打印说明')
print('quit是保存并退出')
def enter_command():
command=input('Enter the command(store/lookup/?/quit/modify/del):')
command=command.strip().lower()
return command
def main():
database=shelve.open('2.db')
try:
while True:
command=enter_command()
if command=='store':
store_person(database)
elif command=='lookup':
lookup_person(database)
elif command=='modify': #修改成功后要quit退出触发close()保存再查询才会生效
modify_person(database)
elif command=='del':
del_person(database)
elif command=='?':
print_help() #虽然这里没有返回值,但是是不会终止循环的
elif command=='quit':
return #这里的return就很讲究了,相当于break,结束这个无穷循环
finally:
database.close() #程序终止并且关闭数据库
if __name__=='__main__':
main()
这里有个小地方需要注意:在while循环中,第一个if虽然调用的函数return的是空值,但是是不会结束这个while循环的,但是第二个elif return返回的是none,这个循环就会结束,目前我还不清楚这个里面的机制
def add():
return
def main():
while True:
com=input('请输入:')
if com=='yes':
add()
elif com=='quit':
return
if __name__=='__main__':
main()
运行结果: