当前位置: 首页 > 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;以及员工…...

WxGL应用实例:绘制点云

WxGL附带了几个工具函数&#xff0c;其中read_pcfile用来解析.ply和.pcd格式的点云文件&#xff0c;该函数返回一个PointCloudData类实例&#xff0c;包含以下属性&#xff1a; PointCloudData.ok - 数据是否可用&#xff0c;布尔型PointCloudData.info - 数据可用性说明&…...

一个月内面了30家公司,薪资从18K变成28K,真行啊····

工作3年&#xff0c;换了好几份工作&#xff08;行业流行性大&#xff09;&#xff0c;每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心&#xff0c;而且特别不喜欢请假面试&#xff0c;对自己负责也对公司负责。 但是这次没想到市场环境非常不好&#xff0c;…...

《计算机网络——自顶向下方法》精炼——1.4到1.7

三更灯火五更鸡&#xff0c;努力学习永不止。无惧困难与挑战&#xff0c;砥砺前行向成功。 文章目录 引言正文时延排队时延 吞吐量协议层次&#xff0c;服务模型&#xff08;重点&#xff09;封装&#xff08;重点&#xff09;网络安全&#xff08;选看&#xff09;恶意软件的分…...

消息队列 (Message Queue)

消息队列 What 消息队列 是消息的队列&#xff1b;是消息的临时缓冲&#xff1b;是发布/订阅模式的兄弟&#xff1b;在多个进程/线程间实现异步通讯模式。 Why 消息队列在多个进程/线程中实现了异步通讯模式。 这里我们先介绍下同步消息处理。对于同步消息处理&#xff0…...

JavaScript原型链污染学习记录

1.JS原型和继承机制 0> 原型及其搜索机制 NodeJS原型机制&#xff0c;比较官方的定义&#xff1a; 我们创建的每个函数都有一个 prototype&#xff08;原型&#xff09;属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c; 而这个对象的用途是包含可…...

顶级白帽黑客必备的十大黑客技术

1.熟悉Linux系统和命令行操作&#xff1a; Linux是黑客的基石&#xff0c;几乎所有黑客工具和技术都是在Linux平台上运行的&#xff0c;熟悉Linux系统和命令行操作是必须的。 2.掌握网络协议和TCP/IP模型&#xff1a; 了解TCP/IP模型、网络协议和通信流程是黑客攻击的基础&a…...

【关于认证鉴权一些概念梳理】

关于认证鉴权一些概念梳理 记录一些灵感瞬间聊聊Session&#xff0c;Cookie和Token三剑客的特性前后端分离登录中的springsecurity与不分离的异同三更up关于springSecurity的讲解B站知乎上关于springSecurity的讲解掘金大佬SpringSecurityJWT认证流程解析一个权限对应一个资源&…...

16.网络爬虫—字体反爬(实战演示)

网络爬虫—字体反爬 一字体反爬原理二字体反爬模块FonttoolsTTF文件 三FontCreator 14.0.0.2790FontCreatorPortable下载与安装 四实战演示五后记 前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域…...

BOM概述

目录 什么是BOM 浏览器对象模型&#xff08;Browser Object Model (BOM)&#xff09; Window对象 一些常用方法 JavaScript Window Screen Window Screen Window Screen 高度 Window Screen 可用宽度 Window Screen 可用高度 Window Screen 色深 Window Screen 像素深…...

3.Docker实用技术

Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…...

长安公司网站建设/竞价推广托管

实际上git使用越来越普及了&#xff0c;当然如果你还是把它当作svn来使用&#xff0c;或者就是只是通过一些图形化工具上几个按钮点一点就失去很多git自身有魅力的地方。首先对照svn或者其他上一代的版本管理工具&#xff0c;我们修改文件不再有“这个文件要不要lock的问题”&a…...

网页升级访问新区域/许昌正规网站优化公司

Zotero安装过程 Zotero官方下载链接&#xff1a;https://www.zotero.org/&#xff0c;目前应该是可以直接访问下载的。另外别忘了一起把浏览器的插件也安装好。 顺便注册一个同步账号&#xff0c;方便在其他移动端访问。注册好后&#xff0c;在Zotero中点击左上角“编辑”-“首…...

wordpress 修改语言包/广州优化疫情防控举措

Bootstrap框架的表单控件的禁用状态和普通的表单禁用状态实现方法是一样的&#xff0c;在相应的表单控件上添加属性“disabled”。 在使用了“form-control”的表单控件中&#xff0c;样式设置了禁用表单背景色为灰色&#xff0c;而且手型变成了不准输入的形状。如果控件中不使…...

wordpress扁平化主题/成都seo的方法

——阶段 动态规划问题通常都具有时间或空间上的次序性&#xff0c;因此求解这类问题时&#xff0c;首先要将问题按一定的次序划分成若干相互联系的阶段&#xff0c;以便能按一定次序去求解。如例1&#xff0c;可以按空间次序划分为A—B—C—D—E 4个阶段&#xff0c;而例2&…...

商城网站建设需要什么团队/怎么注册网站平台

七&#xff1a;桥接模式&#xff08;bridge&#xff09; 1.问题引出&#xff1a;商城系统中很多商品分类&#xff0c;以电脑为例&#xff1a;台式机&#xff0c;笔记本&#xff0c;平板电脑等&#xff0c;我们可以通过下图描述其关系 通过上面的图会发现很多问题&#xff1a; …...

大淘客网站商品做淘口令/站长之家工具查询

今天周六&#xff0c;突然想看看自己这一周项目的进度&#xff0c;看看每天在GitHub提交了什么模块。 通过百度&#xff0c;找到了一个很简单的方法&#xff1a; 1.打开项目&#xff0c;点击“x commits” 2.查看历史的提交 补充&#xff1a;如果在我们在写代码、数次修改并提…...