【JS逆向课件:第六课:文件操作】

文件操作

引言
  • 到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢?现在你是否感觉你的编程技巧还缺了点什么呢?是的,我们还缺少将数据在本地文件系统进行持久化的能力,白话讲就是文件的读写能力。
文件打开
  • 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.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.打开一个图片文件,读取其二进制的数据

      • 2.将读取到的数据写入到另一个路径下

      • fp = open('bobo.jpg','rb') #r是读取文本数据,rb是读取二进制数据
        img_data = fp.read() #读取到了图片的二进制数据#将图片的二进制数据写到另一个路径下
        fp1 = open('/Users/zhangxiaobo/Desktop/bobo123.jpg','wb')
        fp1.write(img_data)fp.close()
        fp1.close()
        

练习:登录注册

'''
需求:注册功能1.让用户录入用户名,密码,重复密码,手机号基本信息2.检测两次输入的密码是否一致,一致则注册成功,否则注册失败3.注册成功后需要将用户信息存储到文件中进行保存
'''def regist():#让用户录入用户名,密码,重复密码,手机号基本信息print('------欢迎来到注册页面--------')username = input('输入注册的账号:')password = input('输入注册的密码:')repeatpwd = input('重复密码:')phonenum = input('手机号:')#检测两次输入的密码是否一致,一致则注册成功,否则注册失败if password == repeatpwd:#==可以判断两个字符串是否一样:#两次密码一致:注册成功,将用户信息写入到文件保存with open('userData.txt','a+') as fp:#\n表示回车换行的意思fp.write(username+'-'+password+'-'+phonenum+'\n')print('恭喜您注册成功,账号为:',username)else:#两次密码不一致,注册失败print('两次密码不一致,注册失败,请重新注册!')'''
登录功能:1.让用户录入用户名,密码2.验证登录状态
'''def login():#1.让用户录入用户名,密码print('------欢迎来到登录页面------')username = input('请输入登录的账号:')password = input('请输入登录的密码:')#2,验证登录状态#读取文件中的用户信息的数据with open('userData.txt','r') as fp:#[bobo-123-222, jay-456-666]user_data_list = fp.readlines() #读取每一行数据,返回的是一个列表for data in user_data_list:data = data.strip()#取出字符串中的回车#切分字符串,取出用户名和密码即可#s_data = [bobo,123,222]s_data = data.split('-')#从文件中获取的用户名和密码f_username = s_data[0]f_password = s_data[1]#判断登录状态flat = 0 #如果flat=0表示登录失败,为1表示登录成功if username == f_username and password == f_password:flat = 1 #表示登录成功breakif flat == 1:print('登录成功')else:print('登录失败')login()
# regist()#调用该函数完成注册功能

管理系统完整实现(自己拓展:了解):

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://xiahunao.cn/news/3249833.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【JS逆向课件:第四课:流程控制】

流程控制 条件判断 顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。 单分支语句 语法: if 表达式:代码块说明: 1、“表达式”可以是一个单一的值或者复杂语句,形…

[Maven] 打包编译本地Jar包报错的几种解决办法

目录 方式1:通过scope指定 方式2:通过新建lib 方式3:通过build节点打包依赖​​​​​​​ 方式4:安装Jar包到本地 方式5:发布到远程私有仓库 方式6:删除_remote.repositories 方式7:打包…

TCP三次握手与四次挥手详解

1.什么是TCP TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,属于互联网协议族(TCP/IP)的一部分。TCP 提供可靠的、顺序的、无差错的数据传输服务&…

element UI :el-table横向列内容超出宽度,滚动条不显示问题

是否能解决你问题的前提 **看到这篇文章的解决问题的方案之前,请先回忆你是否在项目中的全局样式或者私有组件中去单独设置过滚动条样式。如果有 请继续往下看:**单独设置过滚动条样式代码实例: ::-webkit-scrollbar {/*滚动条整体样式*/wi…

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1,介绍举例 2,原理和实现实现 3,注意点 1,介绍 一般情况下,action 是一个平面对象,并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…

ExoPlayer架构详解与源码分析(15)——Renderer

系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…

git教程, 命令行版

前言 git就是代码版本管理系统,很简单的作用就是每一次commit之后,修改文件都是跟上一次commit的仓库文件做对比,也可以调出历史的文件查看某次commit修改了什么东西 0环境准备: 安装git, 百度一下,然后打开cmd&…

[word] word表格跨页断开实现教程 #职场发展#媒体

word表格跨页断开实现教程 选中整个word表格 单击鼠标右键,选择“表格属性”选项 切换至“行”标签,找到“允许跨页断行”选项 勾选上“允许跨页断行”,单击“确定”按钮,完成! word表格跨页断开实现教程的下载地址&a…

【机器学习】--下采样原理及代码详解

下采样(Downsampling)是信号处理、图像处理和机器学习中的一个关键概念,主要通过减少数据点的数量来降低信号或图像的采样率 一、定义与原理 定义:下采样是指通过减少数据点的数量来降低信号或图像的采样率。在图像处理中&#…

【05】LLaMA-Factory微调大模型——初尝微调模型

上文【04】LLaMA-Factory微调大模型——数据准备介绍了如何准备指令监督微调数据,为后续的微调模型提供高质量、格式规范的数据支撑。本文将正式进入模型微调阶段,构建法律垂直应用大模型。 一、硬件依赖 LLaMA-Factory框架对硬件和软件的依赖可见以下…

270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡

一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8、两组 64bit DDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡扩展。软件支持windows,Linux操作系统。 二、功能和技术指标: 板卡功…

全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存

全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存 摘要: 本文主要介绍了在使用 Python 面向对象编程时,如何实现组合关系,同时对比了组合关系和继承关系的优缺点,并讲解了…

初阶数据结构的实现1 顺序表和链表

顺序表和链表 1.线性表1.1顺序表1.1.1静态顺序表(不去实现)1.1.2动态顺序表1.1.2.1 定义程序目标1.1.2.2 设计程序1.1.2.3编写代码1.1.2.3测试和调试代码 1.1.2 顺序表的问题与思考 1.2链表1.2.1链表的概念及结构1.2.1.1 定义程序目标1.2.1.2 设计程序1.…

Ai先行者工具与其他品牌大比拼!

AI先行者工具凭借其独特的技术优势和创新能力,成为了行业的焦点。那么,它究竟有哪些过人之处呢? AI先行者工具在算法优化上做了大量的工作。通过深度学习和自然语言处理技术,它能够更准确地理解和回应用户的需求,提供…

Haproy服务

目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…

linux中list的基本用法

内核链表 1 list_head 结构 为了使用链表机制&#xff0c;驱动程序需要包含<linux/types.h>头文件&#xff0c;该文件定义了如下结构体实现双向链&#xff1a; struct list_head {struct list_head *next, *prev; };2 链表的初始化 2.1 链表宏定义和初始化 可使用以…

如何在Mac下修改VSCode侧边栏字体大小

在日常使用VSCode&#xff08;Visual Studio Code&#xff09;进行开发时&#xff0c;我们有时需要对IDE&#xff08;集成开发环境&#xff09;的界面进行一些个性化的调整&#xff0c;以提升我们的开发体验。 比如&#xff0c;有些用户可能会觉得VSCode的侧边栏字体大小不符…

JavaDS —— 二叉树

树的基本概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 树形结构中&#xff0c;子树之间不能有…

健康问题查询找搜索引擎还是大模型

随着自然语言处理&#xff08;NLP&#xff09;的最新进展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经成为众多信息获取任务中的主要参与者。然而&#xff0c;传统网络搜索引擎&#xff08;SEs&#xff09;在回答用户提交的查询中的作用远未被取代。例如&#xf…

idea怎么配置gradle多个版本

1.背景 gradle版本很多,而且很多时候版本是不兼容的,我们希望拉取下来的代码就包含已经配置好的版本,而不是去配置本机的gradle版本..... 意思就是要实现项目A可以用6.X版本 项目B可以使用7.X版本 项目C可以用9.X版本..... 2.配置方式 步骤一:项目根路径下保留一个文件夹…