文件
变量就在内存中,文件在硬盘中.
内存空间更小,访问速度快,成本贵,数据容易丢失,硬盘空间大,访问慢,偏移,持久化存储.
\\
在才是 \
的含义,只有一个的话是转义字符.
打开文件open
#返回值是文件对象是内存上的一个变量
f=open('E:/test.txt','r')
print(type(f)) #<class '_io.TextIOWrapper'>python文件对象的名字
#关闭文件(使用之后一定要关闭),打开文件是申请了一定的系统资源,资源有限,所以打开文件个数有限
f.close()
读写文件操作都可以拿着这个文件对象来操作,可以叫做句柄handler
,挟天子以令诸侯.
#测试可以打开多少个文件(可通过配置文件设置)
count=0
flist=[]
while True:
f=open('E:/test.txt','r')
flist.append(f)
count+=1
print(f'打开的文件个数:{count}')
8189+3=8192=2^13
每个程序在启动的时候都会默认代开三个文件,标准输入,标准输出,标准错误.
python的垃圾回收机制GC,当上述代码不将f放到flist中时,会自动触发垃圾回收机制,让文件自动关闭,但是自动释放资源不一定及时,因此还是尽量手动释放.
写文件
中文和英文类似,在计算机中都是使用’数字’来表示字符,数字对应汉字版本有很多,主流是UTF8,GBK实际开发中就要保证文件内容的编码方式代码中操作文件的编码方式匹配.
f=open('E:/test.txt','r',encoding='utf8')
result=f.read(2) #指定几个字符,一个汉字也是一个字符在python中
print(result)
f.close()
#按行读取 for循环
f=open('E:/test.txt','r',encoding='utf8')
for line in f:
print(f"line={line}",end="")#print自动带有\n,end参数指定是啥,默认是换行
f.close()
#readlines直接将整个文件内容读取出来
f=open('E:/test.txt','r',encoding='utf8')
lines=f.readlines()
print(lines)
f.close()
上下文管理器
万一中间代码中有条件判定,函数返回抛出异常就会忘记后面的关闭文件.
当with对应的代码块执行结束,就会自动的执行f的close操作
def Func():
with open('E:/test.txt','r',encoding='utf8') as f:
#各种代码
lines= f.readlines()
print(lines)
#文件查找工具
#输入要查找的路径,文件名
#递归查找,遇到子目录就进到目录中,进行查找
#os.walk只需要使用简单的循环.,就可以实现递归的
import os
inputPath=input("请输入路径:")
pattern=input("输入关键字:")
#帮助理解os.walk()函数
# for dirpath,dirname,filename in os.walk(inputPath):
# print("------------------------------")
# print(f"dirpath={dirpath}")
# print('dirnames:')
# for name in dirname:
# print(name)
# print("filenames:")
# for name in filename:
# print(name)
for dirpath,_,filename in os.walk(inputPath):
for f in filename:
if pattern in f:
print(f"{dirpath}/{f}")
inputPath):
for f in filename:
if pattern in f:
print(f"{dirpath}/{f}")
# 翻转单词顺序
#使用空格进行切分,然后放在列表中,然后逆序
def reverse_word(s: str):
tokens=s.split(' ')
tokens.reverse()
return ' '.join(tokens)
print(reverse_word("I am a student."))
#旋转字符串
def rorateString(s,goal):
if len(s)!=len(goal):
return False
return goal in s+s
print(rorateString("abcde","cdeab"))
#word[i]是否是s的前缀 startswith()
def countPrefixes(words: list,s: str):
count=0
for word in words:
if s.startswith(word):
count+=1
return count
第三方库
手机应用商店方便收罗各种公司的软件,python的第三方库也是如此.python官方搞了一个网站pypi,收集各种第三方库,使用pip工具就能下载.安装python时已经被装好了,可以直接用.pip install +库名
,然后就导入模块就行.
简单应用案例
使用python生成二维码
本质上就是一个字符串,生活中的都是一个URL.
qrcode第三方库
import qrcode
img=qrcode.make("xiaoawei 必牛逼!")
img.save('qrcode.png')
使用python操作excel
第三方库
读取Excel使用xlrd模块,修改用xlwt模块
#操作excel
import xlrd
# 打开xlsx
xlsx=xlrd.open_workbook('E:/test/test.xlsx')
# 获取指定的标签页
table=xlsx.sheet_by_index(0)
#获取表格中多少行
nrows=table.nrows
# 循环统计操作
total=0
count=0
for i in range(1,nrows):
#拿到班级下标,每一行的第一列
classId=table.cell_value(i,1)
if classId==100:
total+=table.cell_value(i,2)
count+=1
print(f"平均分:{total/count}")
程序员鼓励师
每间隔一段时间就让电脑发出声音鼓励一下:
-
播出声音~playsound第三方库
-
监听键盘按键,pynput库.连续按键N次就播放音频
准备音频文件,拷贝到项目目录
from pynput import keyboard
from playsount import playsound
import random
from threading import Thread
soundlist=['sound/1.mp3','sound/2.mp3','sound/3.mp3']
count=0
def onRelease(key):
'''
这个函数,在用户释放键盘按键时就会被调用
这个函数不是主动调用的,交给listener,由listener在用户释放按键的时候自动调用
像这样不是自己主动调用,而是交给别人在合适的时机进行调用,这样的函数叫
回调函数
:param key:用户按下了哪个键
:return:
'''
print(key)
count +=1
if count%20==0:
#播放音频
i=random.randint(0,len(soundlist)-1)
#播放音频消耗时间多,造成输入的卡顿
#可以使用线程,播放音频
#playsound(soundlist[i])
t=Thread(target=playsound,args=(soundlist[i],))
t.start()
listener=keyboard.Listener(on_release=onRelease)
listener.start()
listener.join()
学生管理系统
import os.path
import sys
#列表每个元素都是一个字典
students=[]
def menu():
print('---------')
print('1.新增学生')
print('2.显示学生')
print('3.查找学生')
print('4.删除学生')
print('0.退出程序')
print('---------')
choice = input("请输入你的选择")
return choice
def insert():
print("新增学生开始")
id=input('请输入学生的学号')
name=input('请输入学生的姓名')
gender=input('请输入性别')
if gender not in ('男','女'):
print('性别不合理')
return
classname=input('请输入班级名称')
#使用字典聚合
student={
'id':id,
'name':name,
'gender':gender,
'classname':classname
}
global students
students.append(student)
save()
print("新增学生完毕")
def show():
print('学生信息如下:')
for s in students:
print(f"[{s['id']}]\t[{s['name']}]]\t[{s['gender']}]\t[{s['classname']}]")
print(f'学生信息如上,一共{len(students)}条数据')
def find():
print("查找学生开始")
count=0
name=input('请输入要查找同学的姓名')
for s in students:
if name==s['name']:
print(f"查找->[{s['id']}]\t[{s['name']}]]\t[{s['gender']}]\t[{s['classname']}]")
count+=1
print(f"查找学生结束,一共查找了{count}个匹配的学生")
def erase():
print('删除学生开始')
id=input('请输入你想删除的学生id')
for s in students:
if id==s['id']:
print(f"删除->[{s['id']}]\t[{s['name']}]]\t[{s['gender']}]\t[{s['classname']}]")
students.remove(s)
save()
print('删除学生完毕')
def save():
'''
用于存档
:return:
'''
with open('record.txt','w',encoding='utf8') as f:
for s in students:
f.write(f"{s['id']}\t{s['name']}\t{s['gender']}\t{s['classname']}\n")
print(f'存档成功,一共存档了{len(students)}条数据')
def load():
'''
用于读档操作
如果读档文件不存在,就直接跳过读档,避免读方式异常
:return:
'''
if not os.path.exists('record.txt'):
return
global students
#读档的时候要保证先把旧的数据给清理干净
students=[]
with open('record.txt','r',encoding='utf8') as f:
for line in f:
#针对这一行数据,按照\t进行切分操作
#切分之前,要去除末尾的换行,
#去掉开头和结尾的空白符号
line=line.strip()
tokens=line.split('\t')
if len(tokens) !=4:
print(f'当前行存在格式问题!line={line}')
continue
student={
'id':tokens[0],
'name':tokens[1],
'gender':tokens[2],
'classname':tokens[3]
}
students.append(student)
print(f'读档成功,共读档了{len(students)}条数据')
def main():
print('-----------------------------------')
print(' 欢迎来到学生管理系统 ')
print('-----------------------------------')
load()
while True:
choice=menu()
if choice=='1':
insert()
elif choice=='2':
show()
elif choice=='3':
find()
elif choice=='4':
erase()
elif choice =='0':
sys.exit(0)
else:
print("输入有误,请重新输入")
print('bye~')
main()
#约定数据存储在py文件同级目录下的record.txt中,文档中按行文本的方式表示
# 每一行表示一个学生,信息之间用\t来分割(tab)
#