一、sys库

常用的几个函数:

  1. 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

运行结果如下:

python脚本cp Python脚本常用库_元组


2.sys.path:返回在import模块的时候解释器的搜索目录,即去这些目录下找对应的模块

3.sys.exit():退出程序,0是正常退出,退出的时候会引发SystemExit异常,可以通过捕获这个异常做别的操作

import sys
try:
    exit(0)
except SystemExit as value:
    print(value)

运行结果:

python脚本cp Python脚本常用库_python脚本cp_02


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)

运行结果:绿色是输入内容

python脚本cp Python脚本常用库_python脚本cp_03

import sys
print('接下来的输出如下:')
sys.stdout.write('标准输出')

python脚本cp Python脚本常用库_元组_04

二.os库

常用的几个函数:

1.os.listdir():返回当前目录 下的所有文件,遍历某个文件夹下的所有文件这个操作很有用,还可以配合startwith()和endswith()进行操作

2.os.walk():当函数遇到一个目录,会递归调用这个目录下的子目录,并产生一个元组,元组包含这个目录的路径,这个目录下的子目录的路径,这个目录下文件的绝对路径。

直接调用这个,返回的是一个迭代器,所以我们可以用sorted或者for处理一下,就可以输出我们想要的内容了

文件夹的情况:

python脚本cp Python脚本常用库_sed_05

import os
# print(sorted(os.walk('E:\\pythonProject')))
for i in os.walk('E:\\pythonProject'):
    print(i)

运行结果:

python脚本cp Python脚本常用库_sed_06


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()函数,但是这个处理大文件的效率更高

文件效果:

python脚本cp Python脚本常用库_python脚本cp_07

import fileinput
print(fileinput.input('1.txt'))
for line in fileinput.input('1.txt'):
    print(line)

运行效果:

python脚本cp Python脚本常用库_python脚本cp_08


因为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',)

运行结果:

python脚本cp Python脚本常用库_元组_09


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()

运行结果:

python脚本cp Python脚本常用库_元组_10


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)

python脚本cp Python脚本常用库_sed_11


这里有个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)

结果:

python脚本cp Python脚本常用库_sed_12

四、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()

运行结果:

python脚本cp Python脚本常用库_元组_13