2024-9.python文件操作

文件操作

引言
  • 到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢?现在你是否感觉你的编程技巧还缺了点什么呢?是的,我们还缺少将数据在本地文件系统进行持久化的能力,白话讲就是文件的读写能力。
文件打开
  • Python内置了一个open()方法,用于对文件进行读写操作。使用open()方法操作文件就像把大象塞进冰箱一样,可以分三步走,一是打开文件,二是操作文件,三是关闭文件。

  • 文件句柄/文件描述符

    • open()方法的返回值是一个file对象,可以将它赋值给一个变量,这个变量就是所谓的文件句柄。
    • file对象:
      • 可以调用read()和write()方法,对打开的文件进行读写操作。
  • open方法的语法

    • f = open(filename, mode)
      • filename:
        • 一个包含了你要访问的文件名称的字符串值,通常是一个文件路径。
      • mode:
        • 打开文件的模式,有很多种,默认是只读方式r。
  • 文件打开的模式:

  • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 常规文件打开模式操作演示

    • b模式:
      • 二进制模式,通常用来读取图片、视频等二进制文件。注意,它在读写的时候是以bytes类型读写的,因此获得的是一个bytes对象而不是字符串。在这个读写过程中,需要自己指定编码格式。在使用带b的模式时一定要注意传入的数据类型,确保为bytes类型。
    • +模式:
      • 对于w+模式,在读写之前都会清空文件的内容,建议不要使用!
      • 对于a+模式,永远只能在文件的末尾写入,有局限性!
      • 对于r+模式,也就是读写模式,配合seek()和tell()方法,可以实现更多操作。
  • 编码问题

    • 要读取非UTF-8编码的文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件
    • 遇到有些编码不规范的文件,可能会抛出UnicodeDecodeError异常,这表示在文件中可能夹杂了一些非法编码的字符。遇到这种情况,可以提供errors=’ignore‘参数,表示如果遇到编码错误后如何处理。
文件对象操作
  • 每当我们用open方法打开一个文件时,将返回一个文件对象。这个对象内置了很多操作方法。

  • f.read(size) #size读取数据的个数

    • 读取一定大小的数据, 然后作为字符串或字节对象返回。size是一个可选的数字类型的参数,用于指定读取的数据量。当size被忽略了或者为负值,那么该文件的所有内容都将被读取并且返回。
    • 注意:
      • 如果文件体积较大,请不要使用read()方法一次性读入内存,而是read(512)这种一点一点的读。
  • f.readline()

    • 从文件中读取一行n内容。换行符为’\n’。如果返回一个空字符串,说明已经已经读取到最后一行。这种方法,通常是读一行,处理一行,并且不能回头,只能前进,读过的行不能再读了。
  • f.readlines()

    • 将文件中所有的行,一行一行全部读入一个列表内,按顺序一个一个作为列表的元素,并返回这个列表。readlines方法会一次性将文件全部读入内存,所以也存在一定的风险。但是它有个好处,每行都保存在列表里,可以随意存取。
  • #需求:读取文件中的数据
    fp = open('./test.txt','r')
    text = fp.read(10) #读取指定字节的数据
    text_line = fp.readline() #一次读取一行数据
    text_lines = fp.readlines() #读取多行数据,返回一个列表
    print(text_lines)
    fp.close()
    
  • 总结:

    • 几种不同的读取和遍历文件的方法比较:如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。普通情况,使用for循环更好,速度更快。
  • f.write()

    • 将字符串或bytes类型的数据写入文件内。write()动作可以多次重复进行,其实都是在内存中的操作,并不会立刻写回硬盘,直到执行close()方法后,才会将所有的写入操作反映到硬盘上。在这过程中,如果想将内存中的修改,立刻保存到硬盘上,可以使用f.flush()方法。

    • fp = open('./test123.txt','w')
      fp.write('hello bobo')
      fp.close() #将文件内容清空,在写入新数据
    • fp = open('./test123.txt','a')
      fp.write('hello bobo')
      fp.close() #在文件数据末尾追加数据
  • f.tell()

    • 返回文件读写指针当前所处的位置,它是从文件开头开始算起的字节数。一定要注意了,是字节数,不是字符数。

    • fp = open('./test123.txt','w')
      # fp.write('hello bobo')
      print(fp.tell())
      fp.close()
      
  • f.seek()

    • 如果要改变文件指针的位置, 可以使用f.seek(offset, from_what)方法。seek()经常和tell()方法配合使用。

    • from_what

      • 如果是0表示从文件开头计算
      • 如果是1表示从文件读写指针的当前位置开始计算
      • 2表示从文件的结尾开始计算,默认为0
    • offset:表示偏移量

      • seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字节
      • seek(x,1) : 表示从当前位置往后移动x个字节
      • seek(-x,2):表示从文件的结尾往前移动x个字节
      fp = open('./test.txt','r')
      fp.seek(9,0)
      text = fp.read(5)
      print(text)
      fp.close()
      
  • f.close()

    • 关闭文件对象。当处理完一个文件后,调用f.close()来关闭文件并释放系统的资源。文件关闭后,如果尝试再次调用该文件对象,则会抛出异常。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了,或者更糟糕的结果。也就是说大象塞进冰箱后,一定不要忘记关上冰箱的门。
with关键字

with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。注意缩进。

with open('./test123.txt','r') as fp: #fp = open()text = fp.read(5)
print(text)#上下两组代码功效一样
fp = open('./test123.txt','r')
text = fp.read(5)
print(text)
fp.close()

简易图书管理系统

  • 注册功能
  • 登录功能
  • 图书的录入
  • 图书的删除
  • 图书的修改操作
  • 图书的查询操作
注册实现
  • 1.判定两次密码一致,则注册成功
def regist():print('欢迎来到注册页面')print('-------------')username = input('enter username:')password = input('enter password:')repeatpwd = input('repeat enter password:')email = input('enter email:')#判定用户的注册状态if password == repeatpwd:with open('./userData.txt','a') as fp:#bobo-123-123@qq.com#jay-456-456@qq.comfp.write(username+'-'+password+'-'+email+'\n')print('注册成功!')else:print('两次密码不一致,注册失败!')
def login():passdef main_view():print('欢迎来到xxx管理系统')print('----------------')print('1.登录\n2.注册\n3.退出')choose = input('请选择功能:')if choose == '1':login()elif choose == '2':regist()elif choose == '3':exit() #退出整个程序else:print('输入有误,程序退出!')main_view()
  • 在两次密码一致的情况下,在验证用户名是否重复

  • def regist():print('欢迎来到注册页面')print('-------------')username = input('enter username:')password = input('enter password:')repeatpwd = input('repeat enter password:')email = input('enter email:')#判定用户的注册状态if password == repeatpwd:isHave = False#用户名是否重复的状态显示,isHave==True表示用户名重复with open('./userData.txt','r+') as fp:#bobo-123-123@qq.com#jay-456-456@qq.com#读取文件中所有注册用户的用户名user_data_list = fp.readlines()for user_data in user_data_list:userName = user_data.split('-')[0]if username == userName:#用户名重复isHave = Trueif isHave == False:  fp.write(username+'-'+password+'-'+email+'\n')print('注册成功!')else:print('注册失败,%s用户名已被占用!'%username)else:print('两次密码不一致,注册失败!')
    def login():passdef main_view():print('欢迎来到xxx管理系统')print('----------------')print('1.登录\n2.注册\n3.退出')choose = input('请选择功能:')if choose == '1':login()elif choose == '2':regist()elif choose == '3':exit() #退出整个程序else:print('输入有误,程序退出!')main_view()
    
    登录功能实现
    import time
    def regist():print('\n\n欢迎来到注册页面')print('-------------')username = input('enter username:')password = input('enter password:')repeatpwd = input('repeat enter password:')email = input('enter email:')#判定用户的注册状态if password == repeatpwd:isHave = False#用户名是否重复的状态显示,isHave==True表示用户名重复with open('./userData.txt','r+') as fp:#bobo-123-123@qq.com#jay-456-456@qq.com#读取文件中所有注册用户的用户名user_data_list = fp.readlines()for user_data in user_data_list:userName = user_data.split('-')[0]if username == userName:#用户名重复isHave = Trueif isHave == False:  fp.write(username+'-'+password+'-'+email+'\n')print('注册成功,三秒后自动跳转到登录页面......')time.sleep(3) #暂停三秒login()else:print('注册失败,%s用户名已被占用!'%username)print('是否重新注册?y/n')c = input('enter your choose:')if c == 'y' or c == 'Y':regist()else:exit() else:print('两次密码不一致,注册失败!')
    def login():print('\n\n欢迎来到登录页面')print('-------------')username = input('enter username:')password = input('enter password:')#判定登录状态login_state = Falsewith open('./userData.txt','r') as fp:user_data_list = fp.readlines()for user_data in user_data_list:un = user_data.split('-')[0]pw = user_data.split('-')[1]if username == un and password == pw:login_state = Truebreakif login_state == True:print('登录成功')else:print('登录失败,是否返回主页面?y/n')c = input('enter your choose:')if c == 'y' or c == 'Y':main_view()else:exit()
    def findPwd():un = input('enter your username:')em = input('enter your email')with open('./userData.txt','r') as fp:isFind = Falseuser_data_list = fp.readlines()for user_data in user_data_list:username = user_data.split('-')[0]email = user_data.split('-')[2]#将email中的回车去掉email = email.strip()if username == un and email == em:password = user_data.split('-')[1]print('找回的密码为:',password)isFind = Truebreakif isFind == False:print('密码找回失败,用户名和邮箱不匹配!')
    def main_view():print('欢迎来到xxx管理系统')print('----------------')print('1.登录\n2.注册\n3.找回密码\n4.退出')choose = input('请选择功能:')if choose == '1':login()elif choose == '2':regist()elif choose == '3':findPwd() elif choose == '4':return #退出整个程序else:print('输入有误,程序退出!')main_view()
    
    拓展内容:python访问链接数据库
    import pymysql #需要单独pip install pymysql进行安装
    #1.链接数据库
    conn = pymysql.Connect(host = '127.0.0.1',port = 3306,user = 'root',password = 'boboadmin',db = 'AnHui',charset = 'utf8'
    )#2.创建一个游标对象(用来执行sql语句)
    cursor = conn.cursor()#3.可以通过创建好的游标对象执行相关的sql语句
    #sql = 'delete from userData where username="tom"'
    sql = 'insert into userData (username,password,email) values ("tom","333","333@qq.com")'
    cursor.execute(sql)#4.事物的处理
    conn.commit()
    
    import pymysql
    #1.链接数据库
    conn = pymysql.Connect(host = '127.0.0.1',port = 3306,user = 'root',password = 'boboadmin',db = 'AnHui',charset = 'utf8'
    )#2.创建一个游标对象(用来执行sql语句)
    cursor = conn.cursor()#3.可以通过创建好的游标对象执行相关的sql语句
    #查询数据
    sql = 'select * from userData'
    cursor.execute(sql)
    result = cursor.fetchall()
    print(result)#4.事物的处理
    conn.commit()
    

管理系统完整实现:

import time
def regist():print('\n\n欢迎来到注册页面')print('-------------')username = input('enter username:')password = input('enter password:')repeatpwd = input('repeat enter password:')email = input('enter email:')#判定用户的注册状态if password == repeatpwd:isHave = False#用户名是否重复的状态显示,isHave==True表示用户名重复with open('./userData.txt','r+') as fp:#bobo-123-123@qq.com#jay-456-456@qq.com#读取文件中所有注册用户的用户名user_data_list = fp.readlines()for user_data in user_data_list:userName = user_data.split('-')[0]if username == userName:#用户名重复isHave = Trueif isHave == False:  fp.write(username+'-'+password+'-'+email+'\n')print('注册成功,三秒后自动跳转到登录页面......')time.sleep(3) #暂停三秒login()else:print('注册失败,%s用户名已被占用!'%username)print('是否重新注册?y/n')c = input('enter your choose:')if c == 'y' or c == 'Y':regist()else:exit() else:print('两次密码不一致,注册失败!')
def insertBook():title = input('插入图书的名称:')publish_date = input('插入图书的出版时间:')author = input('插入图书的作者:')publish = input('插入图书的出版社:')with open('./bookData.txt','a') as fp:fp.write(title+'-'+publish_date+'-'+author+'-'+publish+'\n')print(title,'插入成功!')print('是否继续插入?y/n')c = input('enter your choose:')if c == 'y' or c == 'Y':insertBook()else:manageView()
def showBooks():print('\n\n')with open('./bookData.txt','r') as fp:book_list = fp.readlines()for book in book_list:print(book)c = input('返回主页面请按1:')if c == '1':manageView()
def deleteBook():#指定一个删除的条件name = input('请输入即将要删除的图书名称:')with open('./bookData.txt','r') as fp:book_list = fp.readlines()for book in book_list:if name in book:book_list.remove(book)fp = open('./bookData.txt','w')for book in book_list:fp.write(book)fp.close()print(name,'被成功删除!3秒后自动跳转会主页面......')time.sleep(3)manageView()
def updateBook():name = input('请输入即将要修改图书的名字:')with open('./bookData.txt','r') as fp:book_list = fp.readlines()for book in book_list:if name in book:old_author = book.split('-')[2]new_author = input('请输入新的作者名称:')new_book = book.replace(old_author,new_author)book_list.append(new_book)book_list.remove(book)breakfp = open('./bookData.txt','w')for book in book_list:fp.write(book)print('图书修改成功!等待3秒返回主页面......')fp.close()time.sleep(3)manageView()def manageView():print('\n\n欢迎来到管理系统')print('1.查看所有图书\n2.插入图书\n3.删除图书\n4.修改图书\n5.返回主页面\n')choose = input('enter your choose:')if choose == '1':showBooks()elif choose == '2':insertBook()elif choose == '3':deleteBook()elif choose == '4':updateBook()else:main_view()
def login():print('\n\n欢迎来到登录页面')print('-------------')username = input('enter username:')password = input('enter password:')#判定登录状态login_state = Falsewith open('./userData.txt','r') as fp:user_data_list = fp.readlines()for user_data in user_data_list:un = user_data.split('-')[0]pw = user_data.split('-')[1]if username == un and password == pw:login_state = Truebreakif login_state == True:manageView()else:print('登录失败,是否返回主页面?y/n')c = input('enter your choose:')if c == 'y' or c == 'Y':main_view()else:exit()
def findPwd():un = input('enter your username:')em = input('enter your email')with open('./userData.txt','r') as fp:isFind = Falseuser_data_list = fp.readlines()for user_data in user_data_list:username = user_data.split('-')[0]email = user_data.split('-')[2]#将email中的回车去掉email = email.strip()if username == un and email == em:password = user_data.split('-')[1]print('找回的密码为:',password)isFind = Truebreakif isFind == False:print('密码找回失败,用户名和邮箱不匹配!')
def main_view():print('欢迎来到xxx管理系统')print('----------------')print('1.登录\n2.注册\n3.找回密码\n4.退出')choose = input('请选择功能:')if choose == '1':login()elif choose == '2':regist()elif choose == '3':findPwd() elif choose == '4':return #退出整个程序else:print('输入有误,程序退出!')main_view()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java EE】依赖注入DI详解

文章目录 🌴什么是依赖注入🍀依赖注入的三种方法🌸属性注入(Field Injection)🌸构造方法注入🌸Setter注入🌸三种注入优缺点分析 🌳Autowired存在的问题🌲解决Autowired对应多个对象问…

动态库静态库linux

动态库静态库 静态库 静态库必须包含在可执行文件里,整个都要包含 缺点:消耗系统大,每个使用静态库的程序都要复制静态库(浪费内存) 影响使用场景: 在静态库内存小的时候,可以用来提升速度 制…

Scala 03 —— Scala Puzzle 拓展

Scala 03 —— Scala Puzzle 拓展 文章目录 Scala 03 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

【C++】<入门>C++入门基础知识

C入门 1. 入门0. 本节知识点熟悉目的1. C关键字(C98) 2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰(name Ma…

Vue3从入门到实践:深度了解新组件

1.Teleport 概念:Teleport(传送门)是一个新的特性,用于在DOM中的任意位置渲染组件。它允许你将组件的内容渲染到DOM中的另一个位置,而不受组件层次结构的限制。 下面举出例子解释: 1.新建App.vue文件作…

RACE IPEMD:构建安全基石的密码学原理与实践

title: RACE IPEMD:构建安全基石的密码学原理与实践 date: 2024/4/16 16:53:56 updated: 2024/4/16 16:53:56 tags: IPEMD哈希算法SHA-1SHA-2/3消息摘要数字签名安全分析 前言 在当今信息爆炸的时代,数据安全和隐私保护变得尤为重要。密码学作为信息安…

计算机视觉——基于OpenCV和Python进行模板匹配

模板匹配? 模板匹配是它允许在一幅较大的图像中寻找是否存在一个较小的、预定义的模板图像。这项技术的应用非常广泛,包括但不限于图像识别、目标跟踪和场景理解等。 目标和原理 模板匹配的主要目标是在一幅大图像中定位一个或多个与模板图像相匹配的…

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接:1584. 连接所有点的最小费用 - 力扣(LeetCode) 主要思路:使用krusal算法,将边的权值进行排序(从小到大排序),每次将权值最小且未加入到连通分量中…

Cesium中实现镜头光晕

镜头光晕 镜头光晕 (Lens Flares) 是模拟相机镜头内的折射光线的效果,主要作用就是让太阳光/其他光源更加真实,和为您的场景多增添一些气氛。 Cesium 中实现 其实 Cesium 里面也是有实现一个镜头光晕效果的,添加方式如下,只是效…

Python教学入门:数字类型与字符串

字符串元素组成的序列 字符串元素组成的序列指的是字符串中的每个字符按照一定的顺序排列形成的序列。在 Python 中,字符串是由字符组成的有序序列(Sequence),每个字符在字符串中有其固定的位置(索引)&…

Android RecyclerView的LayoutManager配置

RecyclerView的item布局方式依赖于其配置的布局管理器。不同的布局管理器可以实现不同的界面效果。 LayoutManager介绍 RecyclerView可以通过setLayoutManager设置布局管理器,该方法的源码如下: /*** Set the {link LayoutManager} that this RecyclerV…

java网络编程 BufferedReader的readLine方法读不到数据且一直阻塞

最近在整理Java IO相关内容,会遇到一些以前没有注意的问题,特此记录,以供自查和交流。 需求: 基于Java的BIO API,实现简单的客户端和服务端通信模型,客户端使用BufferedReader的readLine方法读取System.i…

ASPICE 追溯性实践分享

01前言 接着之前的分享,遗留的追溯性ASPICE 认证实践及个人理解分享-CSDN博客文章浏览阅读961次,点赞22次,收藏17次。ASPICE是Automotive 和SPICE的组合,全英文为(Automotive Software ProcessImprovement and Determ…

C++修炼之路之继承<二>

目录 一:子类的六大默认成员函数 二:继承与友元 三:继承与静态成员 四:复杂的继承关系菱形继承菱形虚拟继承 1.单继承 2.多继承 3.菱形继承;一种特殊的多继承 4.菱形虚拟继承 5.虚拟继承解决数据冗余和二…

小程序 前端如何用wx.request获取 access_token接口调用凭据

在微信小程序中,获取access_token通常是通过wx.request方法来实现的。以下是一个简单的示例代码: 1.获取小程序的appID 与 secret(小程序密钥) 登录之后,请点击左侧的"开发管理"==>点击"开发设置" 就可以找到 2. 在javascript 中的代码: // 定…

性能优化工具

CPU 优化的各类工具 network netperf 服务端&#xff1a; $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…

算法刷题记录2

4.图 4.1.被围绕的区域 思路&#xff1a;图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归&#xff0c;找与边界O联通的O&#xff0c;并标记为#&#xff08;代表已遍历&#xff09;&#xff0c;最后图中剩下的O就是&#xff1a;被X包围的O。图中所有…

温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用

前言 对于一些单片机类的环境检测或者智能家居小项目中&#xff0c;温湿度传感器&#xff08;DHT11&#xff09;以及光照强度传感器&#xff08;BH1750&#xff09;往往是必不可少的两个外设&#xff0c;下面我们来剖析这两个外设的原理&#xff0c;以及使用。 1. 温湿度传感…

嵌入式4-18

做一个简单数据库终端操作系统 #include <myhead.h> int main(int argc, const char *argv[]) {int id;char name[16];float score;sqlite3 *pNULL;if(sqlite3_open("./my.db",&p)!SQLITE_OK){printf("sqlite3_open error\n");return -1;} …

python中中英文打印对齐解决方案

在python中&#xff0c;有时候会出现中英文混合输出的情形&#xff0c;但是由于中文默认是全角格式&#xff08;一个中文字符占用两个字符宽度&#xff09;&#xff0c;这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候&#xff0c;这种差异会导致文…