当前位置: 首页 > news >正文

Python文件操作-代码案例

文章目录

    • 文件
      • 打开文件open
      • 写文件
      • 上下文管理器
        • 第三方库
    • 简单应用案例
      • 使用python生成二维码
      • 使用python操作excel
      • 程序员鼓励师
      • 学生管理系统

文件

变量就在内存中,文件在硬盘中.

内存空间更小,访问速度快,成本贵,数据容易丢失,硬盘空间大,访问慢,偏移,持久化存储.

\\在才是 \的含义,只有一个的话是转义字符.

打开文件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+=1print(f'打开的文件个数:{count}')

image-20230105123727233

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 Falsereturn goal in s+sprint(rorateString("abcde","cdeab"))#word[i]是否是s的前缀 startswith()
def countPrefixes(words: list,s: str):count=0for word in words:if s.startswith(word):count+=1return 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}")

程序员鼓励师

每间隔一段时间就让电脑发出声音鼓励一下:

  1. 播出声音~playsound第三方库

  2. 监听键盘按键,pynput库.连续按键N次就播放音频

准备音频文件,拷贝到项目目录

from pynput import keyboard
from playsount import playsound
import random
from threading import Threadsoundlist=['sound/1.mp3','sound/2.mp3','sound/3.mp3']
count=0
def onRelease(key):'''这个函数,在用户释放键盘按键时就会被调用这个函数不是主动调用的,交给listener,由listener在用户释放按键的时候自动调用像这样不是自己主动调用,而是交给别人在合适的时机进行调用,这样的函数叫回调函数:param key:用户按下了哪个键:return:'''print(key)count +=1if 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 choicedef insert():print("新增学生开始")id=input('请输入学生的学号')name=input('请输入学生的姓名')gender=input('请输入性别')if  gender not in ('男','女'):print('性别不合理')returnclassname=input('请输入班级名称')#使用字典聚合student={'id':id,'name':name,'gender':gender,'classname':classname}global studentsstudents.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=0name=input('请输入要查找同学的姓名')for s in students:if name==s['name']:print(f"查找->[{s['id']}]\t[{s['name']}]]\t[{s['gender']}]\t[{s['classname']}]")count+=1print(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'):returnglobal 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}')continuestudent={'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)
#
http://www.lryc.cn/news/566.html

相关文章:

  • 活动目录(Active Directory)管理,AD自动化
  • Allegro如何使用Vertext命令修改丝印线段的形状操作指导
  • Leetcode力扣秋招刷题路-0030
  • 基于Prometheus和k8s搭建监控系统
  • 类和对象(下)
  • 达梦数据库单机部署
  • 从零到一学习Flutter——(二)状态和路由
  • TC358774XBG/TC358775XBG替代方案|CS5518替代TC358774XBG/TC358775XBG设计DSI转LVSD设计资料
  • Linux---Kernal与Shell讲解
  • Thiol-PEG-Acid,HS-PEG-COOH,巯基-聚乙二醇-羧基试剂供应
  • 数据结构与算法基础-学习-09-线性表之栈的理解、初始化顺序栈、判断顺序栈空、获取顺序栈长度的实现
  • 深入Kafka核心设计与实践原理读书笔记第二章
  • 知乎kol投放怎么做?知乎kol资源从哪里找?
  • python设计模式-享元设计模式,抽象工厂设计模式,面向对象设计模式
  • 10条终身受益的Salesforce职业发展建议!
  • 电子科技大学人工智能期末复习笔记(四):概率与贝叶斯网络
  • 码上掘金实现电子木鱼
  • 深度学习_L2正则化
  • 第一章 认识Python
  • 复习0206
  • 小红书如何查看笔记
  • linux001之linux系统部署安装
  • 服务异步通信 RabbitMQ-高级篇
  • 【PR】零基础快速入门教程
  • Matlab 点云迭代加权最小二乘法拟合平面(抑制噪声)
  • 2023 软件测试行业内卷动荡,红利期过去后,何去何从?
  • 【王道数据结构】第六章(下) | 图的应用
  • Leetcode:518. 零钱兑换 II(C++)
  • Java中类是什么
  • C进阶:预处理