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

python文件操作的基本流程

引入

程序运行过程中产生的数据会保存到内存中,如果想要永久保存下来,就必须将数据存放在硬盘上,应用程序如果想要操作计算机的硬件就必须通过操作系统,文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,应用程序操作文件就是向操作系统发送调用,由操作系统完成对硬盘的操作。

文件操作的基本流程

比如想打开电脑桌面上一个word文档进行操作,步骤应该是:1、双击打开文档; 2、进行某些操作,比如读文件、修改文件等;3、保存后关闭文件。

使用python实现对文件的操作也遵循这三个步骤:

# open()方法常用方式是接收三个参数:文件绝对/相对路径,操作文件的方式,编码格式
# 1.打开文件,应用程序向操作系统发送调用,操作系统打开文件(硬盘上的一块空间),返回一个文件对象赋值给变量file
file = open(r'D:\文件.txt', 'r', encoding='utf-8')  # 以读模式打开文件,打开文件的字符编码是utf-8
# 注意:\在python中有特殊意义,当路径是绝对路径时,需要在路径字符串前加r进行转义;文件路径如果是文件名的话,python会在当前程序文件夹所在路径下去找该文件。# 2、对文件进行操作,比如读文件---调用文件对象的读方法
data = file.read()# 3、关闭文件,向操作系统发送关闭文件的请求
file.close()

使用python打开一个文件之后产生了两部分的内存空间占用,一部分是文件打开后占用的内存空间,另一部分是打开后产生的文件对象,文件操作完成之后需要回收这两部分的内存空间.

file.close()  # 删除文件打开后占用的内存
del file  # 删除文件对象的内存

由于python垃圾回收机制,我们无需考虑删除文件对象这一步,但是在操作完文件之后必须要关闭文件,就是f.close(),否则在电脑上不停的打开文件而不关闭,电脑的内存迟早会被用尽,尽管如此,可能还会有粗心的小伙伴忘记关闭文件,python为了防止这一情况,提供了with关键字来帮助我们管理从打开到关闭整个上下文的流程,因此with关键字也称为with上下文管理。

# 执行完with下的子代码块之后会自动执行f.close()的操作,再也不用担心忘记关闭文件了。
with open('文件.txt', 'r') as f:  # 打开文件,将文件对象赋值给变量fpass   # pass是什么都不做,可以用来占位# 可以用with同时打开多个文件,用逗号分隔
with open('file1.txt', 'r') as f1, open('file2.txt', 'r') as f2:data1 = f1.read()data2 = f2.read()

由于使用python打开文件的时候是通过操作系统完成的,如果打开的文件是文本文件,会涉及到字符编码的问题,如果在打开文件时没有指定字符编码,操作系统就会使用自己默认的编码打开文件(windows下是gbk,在linux下是utf-8),如果要保证不乱码,文件以什么编码格式存的就要以什么格式打开。

操作文件的模式

打开文件后,需要对文件进行进行不同的操作,比如读文件、改文件,因此在使用python打开文件时也需要指定操作文件的方式。控制文件读写操作的模式有三种。

1.只读(r)---默认的操作文件的方式

当文件不存在时会报错,文件存在时,文件内的指针(可以理解为光标)直接跳到文件开头。

with open('a.txt', mode='r', encoding='utf-8') as f:data = f.read()

2.只写(w)

在文件不存在时会在程序文件所在文件夹创建一个文件,如果文件存在,会清空文件中的内容,文件指针跳到文件开头,进行写操作。需要注意的是,在文件不关闭的情况下,写入的数据是按照先后顺序的,如果文件关闭后重新以w模式打开,会清空文件数据。

with open('a.txt', 'w', encoding='utf-8') as f:f.write('hello world\n')  # \n表示换行f.write('my name is python')

3.只追加写(a)

文件不存在时会在当前文件夹创建文件,文件存在时,文件指针直接移动到文件末尾,不会清空文件数据。

a模式和w模式的异同:

相同点:文件不存在都会创建文件,文件不关闭的情况下,数据依次写入

不同点:a模式重新打开文件不会清空文件,文件指针一道末尾,新写的内容跟在旧的内容之后。

with open('a.txt', 'a', encoding='utf-8') as f:f.write('追加的1\n')f.write('追加的2\n')

使用这三种模式操作文件时一定要注意,对文件的操作要么只读,要么只写,不能使用只读的模式打开文件,然后去进行写的操作。但是python提供了可读可写的方法r+ a+ w+,但是在实际开发中要么只读要么只写,一般不使用可读可写的模式。

控制文件读写单位

文件的读写单位有两种模式,一种是字符串模式(t模式),另一种是bytes(二进制)模式(b模式),这两种模式必须和r/w/a之一结合使用。

t模式,文本模式,默认模式,读写文件都是以字符串为单位,只针对文本文件,必须指定encoding参数。

# 如果打开文件时指定打开模式为r/w/a,其实默认就是rt/wt/at
with open('a.txt', 'wt', encoding='utf-8') as f:f.write('haha')  # 写入的数据必须也是字符串格式

b模式,二进制模式,读写文件都是以bytes/二进制为单位,可以针对所有文件,一定不能指定encoding参数。

with open('a.txt', 'wb') as f:info = 'name'# 需要将写入文件的数据转成二进制格式,使用encode()方法指定编码格式可以实现res = info.encode('utf-8')f.write(res)

b模式和t模式对比:

在操作纯文本文件方面,t模式帮助我们省去了编码与解码的环节,所以t模式更方便。

在针对非文本文件(图片、音频等)只能使用b模式。

操作文件的方法 - 读和写

在使用r模式打开文件的时候有几种读取数据的方式

f.read()  # 一次性读取所有内容,如果文件过大,会导致内存不足
f.readline()  # 每次读取文件的一行内容,读完一行后,光标移至第二行行首
f.readlines()  # 一次性读取所有内容,将每一行内容存放于列表中

f.read()和f.readlines()都是将文件一次性读取,如果内容过大,会导致内存不足,如果想要将文件全部读取到内存中,建议分多次读入,有两种实现方式:

# 方式一
with open('a.txt',mode='rt',encoding='utf-8') as f:for line in f:print(line) # 同一时刻只读入一行内容到内存中
# 方式二
with open('好汉歌.mp3', mode='rb') as f:while True:data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中if len(data) == 0:breakprint(data)

同样针对写操作也有几种不同的方式

f.write('hello\nworld\n')  # 针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8'))  # 针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n'])  # 文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

控制文件指针移动

文件内的指针类似于光标,但不同的是文件的指针移动的单位是以bytes为单位,唯一例外的是t模式下的read(n),n是以字符为单位。

with open('a.txt',mode='rt',encoding='utf-8') as f:data=f.read(3) # 读取3个字符with open('a.txt',mode='rb') as f:data=f.read(3) # 读取3个Bytes

r/w/a模式下文件指针的移动是被动触发的,如果想要读取文件某一指定位置的数据,需要使用f.seek()方法主动控制文件内指针的移动。

f.seek()方法需要接收两个参数,第一个参数是指针移动的字节数,第二个参数是模式控制。模式控制有三种:

0模式:默认的模式,表示指针移动的字节数以文件开头作为参照

1模式:表示指针移动的字节数以文件指针当前所在位置作为参照

2模式:表示指针移动的字节数以文件末尾作为参照

其中0模式可以在t/b模式下使用,1模式和2模式只能在b模式下使用。

# 0模式
with open('a.txt',mode='rt',encoding='utf-8') as f:f.seek(3,0)     # 参照文件开头移动了3个字节print(f.tell())  # 查看当前文件指针相对于文件开头的位置# 1模式
with open('a.txt',mode='rb') as f:f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头print(f.tell()) # 输出结果为:3# 2模式
with open('a.txt',mode='rb') as f:f.seek(-3,2)     # 参照文件末尾往前移动了3个字节print(f.read().decode('utf-8')) # 输出结果为:好

修改文件

文件是操作系统为了方便应用程序操作硬盘出现的虚拟概念,本质上文件对应的就是硬盘,硬盘是无法被修改的,一次本质上来说文件是无法被修改的,我们看到的文件的内容可以被修改的原因是:将硬盘中的文件读入内存,在内存中修改之后再覆盖回硬盘。实现的方式有两种:

第一种,将文件中的数据一次性全部读入内存,在内存中修改完成后再覆盖回原文件

'''
优点:文件修改过程中只有同一份数据
缺点:内存占用过多
'''
# 先读入内存
with open('db.txt',mode='rt',encoding='utf-8') as f:data=f.read()
# 修改内存中的数据
with open('db.txt',mode='wt',encoding='utf-8') as f:f.write(data.replace('xxx','python'))

第二种,以读的方式打开一个文件,以写的方式打开另一个文件,一行一行读取原文件,修改后写入新文件

'''
优点:不会占用过多的内存
缺点:需要借助临时文件
'''
import os  # 需要借助os模块进行删除文件和文件重命名操作with open('old.txt',mode='rt',encoding='utf-8') as read_f,\open('new.txt',mode='wt',encoding='utf-8') as wrife_f:for line in read_f:wrife_f.write(line.replace('python','xxx'))os.remove('old.txt')   # 删除未修改的文件
os.rename('new.txt','old.txt')  # 将新文件重命名为和旧文件相同的名字

practice

r模式---使用文件存储用户名密码,实现登陆功能

username = input('please input your username:').strip()
password = input('please input your password:').strip()
with open(r'F:\FullStack\Python_based\info', 'r', encoding='utf-8') as f:for line in f:info = line.strip('\n')  # 去掉每一行后面的换行符,默认文件中每换一行,每行后面都会有换行符name, pwd = info.split(':')  # 解压赋值if username == name and password == pwd:print('successful!')else:  # 要循环完成所有信息之后才知道用户名和密码是否正确print('invalid username or password!')

a模式---使用文件存储用户名密码,实现注册功能

username = input('please input your username:').strip()
password = input('please input your password:').strip()
with open(r'F:\FullStack\Python_based\info', 'a', encoding='utf-8') as f:info = f'{username}:{password}\n'f.write(info)

t/b模式---实现文件拷贝工具

src_path = input('Please enter the path where you want to copy the file:')
target_path = input('please enter the target path:')
with open(r'{}'.format(src_path), mode='rb') as f,\open('{}'.format(target_path), mode='wb') as f1:for line in f:f1.write(line)

相关文章:

python文件操作的基本流程

引入 程序运行过程中产生的数据会保存到内存中,如果想要永久保存下来,就必须将数据存放在硬盘上,应用程序如果想要操作计算机的硬件就必须通过操作系统,文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,应用程序…...

1. 两数之和

原题链接: 1. 两数之和 https://leetcode.cn/problems/two-sum/ 完成情况: ##1. n 2 n^2 n2复杂度 2.HashMap进行优化 3.空间换时间方法 即,构建一个 1 0 − 9 10^-9 10−9 到 1 0 9 10^9 109这个大的数组,然后把数填进去&…...

操作系统:06 进程通信

1 基本概念 进程间通信是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了协同工作必须进行进程间交互数据 2 进程间通信的分类 2.1 简单的进程间通信: 信号(携带附加数据)、文件、命令行参数、环境变量表 2.2 传统的进…...

WRF模式

随着生态文明建设和“碳中和”战略的持续推进,我国及全球气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域(生态、水资源、风资源及碳中和等问题)的主要驱动因素,合理认知气候变化有利于解释生态环境变化机理及过…...

2直接连接的网络与VLAN划分【实验】【计算机网络】

2直接连接的网络与VLAN划分【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网实验目的实验内容及实验环境实验原理共享式以太网交换式以太网 实验过程搭建实验环境初始化序训练操作共享式以太网-操作交换式以太网查看共享式以太网冲突查…...

【Linux0.11代码分析】04 之 head.s 启动流程

【Linux0.11代码分析】04 之 head.s 启动流程 一、boot/head.s 系列文章如下: 系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》 . 1.《【Linux0.11代码分析】01 之 代码目录分析》 2.《【Linux0.11代码分析】02 之…...

自动化测试和selenium的使用

目录 自动化测试定义 为什么选择selenium来作为我们web自动化测试的工具? 自动化测试定位元素 使用cssSelector定位 使用XPath 定位 操作测试对象 模拟手动从键盘输入 点击对象 获取页面文本 清除对象输入的文本内容 添加等待(三种方式&#…...

Ubuntu常用终端操作

终端快捷键 打开 Ctrlaltt:打开终端(默认路径为家目录) Ctrlshiftn:打开终端(与当前终端处于同一路径下) Ctrlshiftt:打开终端(在大终端下面创建小终端) alt数字 关闭 exitCtrld 窗口切换 …...

Spring Security 6.x 系列【34】认证篇之前后端分离场景下的集成方案

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 前言2. 案例演示2.1 未认证2.2 认证成功2.3 认证失败2.4 权限不足2.5 注…...

Qt之QTextToSpeech 让你的应用程序说话

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言QTextToSpeech基础使用1.创建一个QTextToSpeech对象2.朗读文字3.朗读文件和状态信息4.设置QTTS(QTextToSpeech)属性5.输出支持区域的设置列表、语言6.实现小数点朗读QTextToSpeech项目(练习)…...

为什么程序员喜欢用Linux?

Linux哪些行业在运用? Linux系统运用极其广泛,不少用户只知道windows,是因为,Linux的运用主要是在企业端。现在科技极其发达,我们手机在手,就能干很多事情,只需点一点屏幕,轻松完成…...

leetcode 598. 范围求和 II

题目描述解题思路执行结果 leetcode 598. 范围求和 II 题目描述 范围求和 II 给你一个 m x n 的矩阵 M &#xff0c;初始化时所有的 0 和一个操作数组 op &#xff0c;其中 ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该…...

javaweb前置知识

1.CSS CSS的角色&#xff1a;页面显示的美观风格CSS的基础语法&#xff1a;标签样式&#xff1b;类样式&#xff1b;ID样式&#xff1b;组合样式&#xff1b;嵌入式样式表&#xff1b;内部样式表&#xff1b;外部样式表盒子模型&#xff1a;border、margin、padding定位和浮动…...

基于微信小程序的酒店预定管理系统设计与实现

第1章 绪论 1 1.1开发背景与意义 1 1.2开发方法 1 1.3论文结构 1 2系统开发技术与环境 3 2.1 系统开发语言 3 2.2 系统开发工具 3 2.3 系统页面技术 3 2.4 系统数据库的选择 4 2.5 系统的运行环境 4 2.5.1 硬件环境 4 2.5.2 软件环境 4 3系统分析 5 3.1可行性分析 5 3.1.1 经济…...

26. Service——深入学习

本章讲解知识点 Service 会话保持机制Service 的多端口设置Service 支持的网络协议Kubernetes 的服务发现机制Headless ServiceEndpoint Slices这一节我们来讲讲 Service 更多细节 1. Service 会话保持机制 Service 支持通过设置 sessionAffinity 实现基于客户端 IP 的会话保…...

【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效

文章目录 Check If Word Is Valid After Substitutions 检查替换后的词是否有效问题描述&#xff1a;分析代码 Tag Check If Word Is Valid After Substitutions 检查替换后的词是否有效 问题描述&#xff1a; 给你一个字符串 s &#xff0c;请你判断它是否 有效 。 字符串 s…...

基于jenkinsfile布置java工程

需求 通过jenkins发布java项目到服务器 预备环境 项目地址&#xff1a; https://gitee.com/asaland/sb-docker-appJenkins 2.387.3 通过Jenkinsfile实现方式 jenkins ui 配置pipeline 什么是pipeline? 直接看注释吧&#xff0c;简单点就是编排可以多个跨时间的构建代理…...

Spring JpaTransactionManager事务管理

首先&#xff0c;在做关于JpaTransactionManager之前&#xff0c;先对Jpa做一个简单的了解&#xff0c;他毕竟不如hibernate那么热门&#xff0c;其实二者很相识&#xff0c;只不过后期hibernate和JDO 版本都已经兼容了其Jpa&#xff0c;目前大家用的少了。 JPA全称Java Persi…...

全国职业院校技能大赛网络建设与运维赛项赛题(七)

全国职业院校技能大赛 网络建设与运维 赛题 (七)...

asp.net+sqlserver企业公司进销存管理系统

基于WEB的进销存管理系统主要企业内部提供服务&#xff0c;系统分为管理员&#xff0c;和员工2部分。 在本基于WEB的进销存管理系统中分为管理员&#xff0c;和普通用户2中模式&#xff0c;其中管理人员主要是对企业内商品类型。商品信息商品的出入库信息&#xff0c;以及员工…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...