Python学习笔记15:进阶篇(四)文件的读写。

文件操作

学习编程操作中,我觉得文件操作是必不可少的一部分。不管是读书的时候学习的c,c++,工作的前学的java,现在学的Python,没学过的php和go,都有文件操作的模块以及库的支持,重要性毫无疑问。

学习文件操作是编程技能体系中不可或缺的一部分,它对于数据管理、程序间通信、系统维护等多个方面都具有重要意义。

  1. 数据持久化:程序运行过程中产生的数据,通过文件操作可以保存到磁盘上,实现数据的长期存储。这样即使程序关闭或系统重启,数据依然存在,保证了信息的持久性。
  2. 信息交换:文件是程序之间交换数据的一种常见方式。一个程序可以通过读取另一个程序写入的文件来获取数据,或者将自己的处理结果写入文件供其他程序使用,增强了软件之间的兼容性和协同工作能力。
  3. 配置与日志:许多应用程序会使用配置文件来存储设置信息,使得用户无需修改源代码即可调整程序行为。同时,通过记录日志文件,开发者可以追踪程序运行状态,便于调试和故障排查。
  4. 资源管理:在开发多媒体应用、网页服务或其他需要处理大量静态资源(如图片、视频、文档)的场景中,有效地读取、写入和管理这些文件资源是必不可少的技能。
  5. 提升编程能力:掌握文件操作能够加深对操作系统如何管理和访问文件系统的理解,这是编程基础中的重要一环。它涉及到路径管理、权限控制、缓冲区使用等概念,有助于培养良好的编程习惯和问题解决能力。
  6. 跨平台开发:了解不同操作系统(如Windows、Linux、macOS)下文件操作的差异,可以帮助开发者编写更加健壮、可移植的代码,适应多样化的开发环境。

文件读取是Python标准库就支持的操作,也就是说我们可以直接使用内置函数来进行文件的读取,市面上也许有第三方库支持更加细腻功能更多更简便的文件操作,但是今天我们只讲标准库中的操作。

废话不多说,进入正题。

文件路径

在将实际的操作之前,讲一下文件的相对路径和绝对路径。对后面操作文件时有一定的帮助。

在计算机文件系统中,文件路径是用来定位文件位置的字符串。

根据路径参照点的不同,文件路径主要分为两类:相对路径和绝对路径。

绝对路径(Absolute Path)
绝对路径是从文件系统的根目录(如 Windows 的盘符 C:,Linux 和 macOS 的 /)开始的完整路径,能够唯一确定文件的位置,不依赖于当前工作目录。
例如:

Windows: C: Users/Username/Documents/example.txt
Linux/macOS: /home/user/documents/example.txt

相对路径(Relative Path)
相对路径是相对于当前工作目录(即你当前所在的位置)的路径。使用相对路径时,文件的位置是相对于执行代码或命令时的工作目录来决定的。
例如:

如果当前目录是 /home/user/documents/,那么引用 example.txt 的相对路径只需写成 example.txt
或者 ./example.txt(. 表示当前目录)。
要访问同一级目录下的 pictures 文件夹里的 image.jpg,可以写成 pictures/image.jpg。
使用 … 可以向上一级目录移动,如从 /home/user/documents/ 访问 downloads 文件夹下的文件,则路径为 …/downloads/file.zip。

选择何时使用
绝对路径适用于需要明确指定文件位置,不受当前工作目录影响的场景,如配置文件中的资源路径、系统服务启动脚本等。
相对路径更适用于项目内部文件引用,特别是在代码或脚本中,因为它们往往与项目的结构紧密相关,且易于迁移和维护。
理解并恰当使用这两种路径类型,对于编写跨平台、易维护的代码至关重要。

文件读取

  1. 创建读取目标和读取模块。我先新建一个txt文件用作读取目标。同时新建一个文件模块,用于今天的学习。
    在这里插入图片描述

  2. 读取文件。
    在这里插入图片描述
    两行行代码,一行完成了文件的读取,一行完成了打印。注意我的文件内容是中文,所以指定了编码,不指定的话可能会报错。

    with open('test_file.txt', encoding="utf-8") as file_object:print(file_object.read())
    

    with:关键字with 在不再需要访问文件后将其关闭。通常在进行流操作的时候,会有open操作和对应的close操作,这种操作的目的是保证流能够正确的开启和关闭,当流未关闭时,再次访问可能出现未知的错误,甚至流不关闭本身就会导致问题。但是手动的close流,有一个问题就是并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用with,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。

    open()。这是Python中读取文件的函数。介绍一下open函数得入参:

  1. file (必填): 字符串类型,表示要打开的文件的路径和名称。
  2. mode (可选): 字符串类型,表示文件的打开模式。常见的模式有:
    2.1 ‘r’: 读取(默认)
    2.2 ‘w’: 写入,会覆盖原有文件内容
    2.3 ‘a’: 追加,在文件末尾添加内容
    2.4 ‘b’: 二进制模式
    2.5 ‘+’: 读写模式,可以与上述模式组合,如 ‘r+’, ‘w+’, ‘a+’
  3. encoding (可选): 字符串类型,指定文件的编码方式,如 ‘utf-8’, ‘gbk’。默认为 None,则使用系统默认编码。
  4. buffering (可选): 控制缓冲策略。默认为 -1,表示使用默认缓冲策略;0 表示不缓冲;大于 1 的整数表示缓冲区大小;1 表示行缓冲(对于文本模式)。
  5. errors (可选): 指定如何处理编码和解码错误,如 ‘strict’, ‘ignore’, ‘replace’ 等。
  6. newline (可选): 控制换行符的处理方式,如 ‘n’, ‘rn’, ‘’(读取时不转换,写入时不添加)。
  7. closefd (可选): 布尔值,对于特殊文件描述符是否关闭,默认为 True。
  8. opener (可选): 一个可调用对象,用于自定义文件打开方式。

在示例中,我们使用两个参数,必填的文件路径和选填的文件编码方式。文件路径因为我们是放在了项目目录里面。所以直接用的相对路径,当然我们也可以使用绝对路径。但是要注意的是Windows系统,在文件路径中使用的是反斜杠。

with open('D:\测试文件\test_file.txt', encoding="utf-8") as file_object:print(file_object.read())

在这里插入图片描述
使用绝对路径的方式,我们同样打开并读取了在D盘中的test_file.txt文件。

  1. 按行读取文件
    通过for循环,我们可以直接读取文件中的每一行的数据,并且将数据放到一个列表中进行存储。由于我们在文件中是本身就通过回车换行,所以读取的内容也带换行符,我们可以通过字符串去空白的函数去掉。
file_line_list_1 = []
file_line_list_2 = []
with open('test_file.txt', encoding="utf-8") as file_object:line_num = 0for line in file_object:line_num += 1print(f"我是第{line_num}行,内容是{line}")file_line_list_1.append(line)file_line_list_2.append(line.rstrip())
print(file_line_list_1)
print(file_line_list_2)

在这里插入图片描述

  1. 读取指针
    我们在分行读取完文件后,在进行打印读取内容的操作,发现打印的内容是空的,为什么?
with open("D:\\测试文件\\test_file.txt", encoding="utf-8") as file_object:for line in file_object:print(line)print("============分隔===========")print(file_object.read())

在这里插入图片描述

大家要注意,Python读取文件的时候有一个指针,读取以后指针会停在最后读取的位置,在上述代码中,我们分行读取后,指针已经停留到了最后一行,再进行读取的时候,就读取到了空的内容。

这种情况怎么办呢?使用seek()函数,可以修改指针位置。
seek()函数接收两个参数:

offset:偏移量,即从参照点移动的字节数。
whence:可选参数,默认值为 0,表示从文件开头开始计算偏移量;如果为1,则表示从当前位置开始计算;如果为 2,则表示从文件末尾开始计算。

所以我们在第二次读取前调用一次seek函数即可。

with open("D:\\测试文件\\test_file.txt", encoding="utf-8") as file_object:for line in file_object:print(line)print("============分隔===========")file_object.seek(0)print(file_object.read())

在这里插入图片描述
文件内容成功读取并打印。

文件写入

在介绍open函数入参的时候,其实已经讲到了怎么写入文件。通过open函数的传参。
在Python中,文件就是打开和关闭,区别在打开的模式是读取还是写入又或者是其他模式。

with open('test_file.txt', mode="w", encoding="utf-8") as file_object:file_object.write("给测试文件写点东西")

在这里插入图片描述
文件执行在运行框没有信息,但是打开目标文件发现,内容已经写入。注意前面已经说过,“w"是覆盖模式。
在这里插入图片描述
如果你想追加内容,使用mode参数值应该设置为"a”。附加模式下,如果你输入的文件不存在,还会给你创建一个文件。

with open('test_file.txt', mode="a", encoding="utf-8") as file_object:file_object.write("给测试文件写点东西")

在这里插入图片描述
可以看到直接拼接在了最后一行上面,如果你想换下一行拼接,应该怎么办呢?加上换行符,就这么简单!

多次写入

其实多次写入相比和单次相比,重复调用write函数即可。

with open('test_file.txt', mode="a", encoding="utf-8") as file_object:file_object.write("\n给测试文件写一点东西")file_object.write("\n给测试文件写两点东西")file_object.write("\n给测试文件写三点东西")file_object.write("\n给测试文件写四点东西")file_object.write("\n给测试文件写五点东西")file_object.write("\n给测试文件写六点东西")

在这里插入图片描述
多行写入也成功了,是不是很简单。

结尾

文件的读取和写入也讲到这里,只是初级的应用,应对大部分需要操作文件的场景就够了,大家要好好练习。进阶阶段的知识,不敲几次加深印象等于白学了。

点赞收藏关注,感谢支持!!!

作业

  1. 读取文件。
  2. 逐行读取并进行添加条件语句进行输出。
  3. 写入文件,更改文件信息。
  4. 使用附加模式,创建一个文件。

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

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

相关文章

HCIA-速查-ENSP模拟器2步清空配置

需求:清空模拟器配置 清空当前图中配置 步骤1:reset saved-configuration 后输入y确认 步骤2:reboot后输入n否认再输入y确认 验证已经清空配置

idea http client GET 请求 报503错误

idea 提供的 http client 插件,在 GET 请求时总是 报503 的错误,但请求URL可以在浏览器中正常访问。 GET localhost:8080/student Response file saved. > 2024-06-20T160906.503.html 有一种原因跟本地配置的代理有关,如下图。如果在…

基于JSP的高校信息资源共享平台

开头语: 你好呀,我是计算机学长猫哥!如果你对高校信息资源共享平台感兴趣或者有相关需求,可以通过文末的联系方式找到我。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:IDEA…

Java23种设计模式(五)

1、MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。…

前缀和+双指针,CF 131F - Present to Mom

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 131F - Present to Mom 二、解题报告 1、思路分析 很经典的一种把列看作cell 来进行双指针/递推的题型 我们考虑,可以预处理出原矩阵中的所有star 然后我们去枚举矩形的上下边界,把…

python:faces swap

# encoding: utf-8 # 版权所有 2024 涂聚文有限公司 # 许可信息查看:pip install boost # 描述:pip install boost # pip install dlib # pip install cmake3.25.2 # pip install dlib19.24.2 如果安装不上,按此法 # Author : geovindu,G…

【Go】用 DBeaver、db browser 和 SqlCipher 读取 SqlCipher 数据库

本文档主要描述如何用 DBeaver、db browser 和 SqlCipher 上打开加密的 SQLite3 数据库(用 SqlCipher v3 加密) 软件版本 DBeaver:v24.1.0 SQLite-driver: sqlite-jdbc-3.46.0.0.jar dbbrowser-for-sqlite-cipher:3.12.2 SqlCipher cli(ubuntun)&am…

基于Windows API DialogBox的对话框

在C中,DialogBox函数是Windows API的一部分,它用于在Win32应用程序中创建并显示一个模态对话框。DialogBox函数是USER32.DLL中的一个导出函数,因此你需要在你的C Win32应用程序中链接到这个库。 #include "framework.h" #include …

反转链表(java精简版)

反转一个单向链表。 public class ReversingLinkedList {static class Node {int val;Node next;public Node(int val) {this.val val;}public boolean hasNext() {return next ! null;}}public static void main(String[] args) {//构造Node head null;Node shift null;for…

大模型日报|8 篇必读的大模型论文

大家好,今日必读的大模型论文来啦! 1.Pandora:自回归-扩散混合通用世界模型 世界模型模拟世界在不同行动下的未来状态,它们有助于创建交互式内容,并为有依据的长远推理提供基础。然而,目前的基础模型并不…

算法训练与程序竞赛题目集合(L2)

目录 L2-001 城市间紧急救援 输入格式: 输出格式: 输入样例: 输出样例: L2-002 链表去重 输入格式: 输出格式: 输入样例: 输出样例: L2-003 月饼 输入格式: 输出格式: 输入样例: …

【云岚到家】-day03-2-门户缓存实现实战

【云岚到家】-day03-2-门户缓存实现实战 5 缓存实现5.2 定时任务更新缓存5.2.1 分布式调度平台5.2.1.1 jdk提供的Timer定时器5.2.1.2 使用第三方Quartz方式5.2.1.3 使用分布式调度平台XXL-JOB 5.2.2 XXL-JOB5.2.2.1 介绍5.2.2.2 部署调度中心5.2.2.3 执行器 5.2.2 定义缓存更新…

如何在华为 Ascend 设备上运行模型

模型转换:使用华为的模型转换工具 ATC ATC 在 ascend-cann-toolkit 包里 环境 Docker Image: ascendhub.huawei.com/public-ascendhub/ascend-pytorch:24.0.RC1-A2-2.1.0-ubuntu20.04 镜像版本CANN版本Pytorch版本变更项24.0.RC18.0.RC12.1.0基础镜像变更为 ubuntu20.04。p…

vue小总结

知识总结 【 1 】es6 语法总结 # let 定义变量 # const定义常量 ------块级作用域---- # var 以后尽量少用,函数作用域var 在 JavaScript 中是函数作用域或全局作用域。而 let 和 const 是块级作用域。 // 使用 var 声明全局变量 var globalVar "Im a globa…

【Python】一文向您详细解析内置装饰器 @lru_cache

【Python】一文向您详细解析内置装饰器 lru_cache 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕&a…

线程池的简介

定义 线程池就是使用多线程的方式,将任务添加到队列中任务都是runnable或者callable的实现类 优点 线程和任务分离,任务可以复用线程池统一管理线程,线程可以复用避免因为开启和销毁线程造成的资源浪费 官方线程池的参数分析 深度理解 线程池…

Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱

Vim模式 普通模式(Normal Mode): 这是 Vim 的默认模式,用于执行文本编辑命令,如复制、粘贴、删除等。在此模式下,你可以使用各种 Vim 命令来操作文本。插入模式(Insert Mode)&#…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上,在私服管理端也能看到该jar包的完整信息,但是springboot项目引入该jar包发现死活下载不下来,报错如图: 从该错误信息中可以看到,找不到服务名是xxl-job这个的,我们要找的…

vue3delete请求报403forbidden,前后端解决方式,cookie无效问题

在做开发时,前期已经在Controller类加上CrossOrigin(origins "*"),发送get和post请求都没问题,但遇到delete请求时,又报出跨域问题 一.前端添加proxy代理服务器(未能解决) 在vue.config.js中使…

DAY04 HTMLCSS

文章目录 一 表单(1) 数字控件(2) 颜色控件(3) 日期控件(4) 月份控件(5) 星期控件(6) 搜索控件(7) 范围控件 二 浮动框架三 结构化标签四 CSS1 CSS概述2 CSS的编写位置1. inline style 行内样式2. inner style 内部样式3. outer style 外部样式4. 小结 3 CSS选择器1. 通用选择器…