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.mzph.cn/bicheng/30974.shtml

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

相关文章

备忘录模式(大话设计模式)C/C++版本

备忘录模式 C #include <iostream> #include <string> using namespace std;// Memento类&#xff0c;备忘录&#xff0c;此处为角色状态存储箱 class RoleStateMemento { private:int m_vit; // 生命力int m_atk; // 攻击力int m_def; // 防御力 public:RoleStat…

运算放大器(运放)输入偏置电流、失调电流

输入偏置电流定义 理想情况下&#xff0c;并无电流进入运算放大器的输入端。而实际操作中&#xff0c;始终存在两个输入偏置电流&#xff0c;即IB和IB-(参见图1)。 I B I_B IB​的值大小不一&#xff0c;在静电计AD549中低至60 fA(每三微秒通过一个电子)&#xff0c;而在某些高…

JavaScript 输出与弹框

1.console.log()&#xff1b;控制台输出 JS 中常用的调试语句&#xff0c;该语句会将内容输出到控制台的 Console 中。 <script type"text/javascript"> console.log("哈喽&#xff01;&#xff01;&#xff01;"); </script> 2.docment.writ…

Matlab数学建模实战应用:案例3 - 投资组合优化

目录 前言 一、问题分析 二、模型建立 三、Matlab代码实现 完整代码示例 四、模型验证 五、模型应用 实例示范&#xff1a;投资组合优化 步骤 1&#xff1a;导入数据并计算统计量 步骤 2&#xff1a;建立优化模型并求解 步骤 3&#xff1a;绘制有效前沿&#xff08;…

CVPR 2024揭幕,清华大学论文接收量霸榜,轻松碾压斯坦福、麻省理工

CVPR2024 会议之眼 快讯 会议介绍 2024 年 CVPR &#xff08;Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议&#xff0c;于6月17日至21日正在美国西雅图召开。CVPR是计算机视觉和模式识别领域的顶级会议之一。与ICCV和ECCV并称为计算…

LeetCode 平衡二叉搜索树

//平衡二叉搜索数&#xff0c;关键在于平衡两个字&#xff0c;左右数的高度差不超过1&#xff0c;搜索树&#xff0c;左节点小于 根节点 小于右节点 //先谈平衡&#xff0c;我们找到数组的中间节点作为数的根节点&#xff0c;这个方法被论证过是可行的&#xff0c;然后…

TikTok账号运营:静态住宅IP为什么可以防封?

静态住宅IP代理服务是一种提供稳定、静态IP地址并可隐藏用户真实IP地址的网络代理服务。此类代理服务通常使用高速光纤网络来提供稳定、高速的互联网体验。与动态IP代理相比&#xff0c;静态住宅IP代理的IP地址更稳定&#xff0c;被封的可能性更小&#xff0c;因此更受用户欢迎…

整理好了!2024年最常见 20 道设计模式面试题(七)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道设计模式面试题&#xff08;六&#xff09;-CSDN博客 十三、请解释桥接模式&#xff0c;并给出一个使用场景。 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与…

fastadmin完全自定义页面内容

fastadmin的后台管理页面全自动生成非常方便,但是有些复杂查询确不太好弄,需要完全自定义,但是遵从以下几个步骤即可轻松定制了 1.随便使用某个数据表生成页面所需内容 通过命令工具即可完成 2.自定义返回内容 在controller的index方法里面,删除掉原来返回的内容(主要是aja…

通过数字证书获取CRL吊销列表

在一些对安全性要求比较严格的企业,需要在每次使用证书时,要求对证书的有效性进行验证,如何验证可查看我的其他博客。其中验证的吊销列表(CRL)是可以从数字证书中获取吊销列表文件的发布地址的。 一、一般CRL的使用场景设计 证书颁发机构对CRL的发布也不是实时的,在证书…

计算机网络 —— 应用层(DHCP)

计算机网络 —— 应用层&#xff08;DHCP&#xff09; 什么是DHCPDHCP工作过程DHCP DISCOVERDHCP OFFERDHCP RQUESTDHCP ACK DHCP租约机制中继代理工作原理功能与优势 我们今天来计网的DHCP&#xff1a; 什么是DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&…

2024年,收付通申请开通流程

大家好&#xff0c;今天咱们来聊聊关于APP场景中开通微信收付通的一些实用小窍门。在如今的移动互联网时代&#xff0c;很多商家都选择通过APP来提供服务和产品&#xff0c;因此如何在APP中顺利集成微信收付通功能&#xff0c;让用户能够轻松完成支付&#xff0c;就显得尤为重要…

分支结构相关

1.if 语句 结构&#xff1a; if 条件语句&#xff1a; 代码块 小练习&#xff1a; 使用random.randint()函数随机生成一个1~100之间的整数&#xff0c;判断是否是偶数 import random n random.randint(1,100) print(n) if n % 2 0:print(str(n) "是偶数") 2.else语…

Vue中使用ElementUI组件Form组件的校验validate

先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的&#xff0c;如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧&#xff01; 1.在el-form中绑定一个ref&#xff0c;名字自拟,后续触发检验结果…

代码随想录算法训练营第四十四天|LeetCode198 打家劫舍、LeetCode213 打家劫舍Ⅱ

题1&#xff1a; 指路&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 思路与代码&#xff1a; 对于这个题&#xff0c;拿房屋i举例&#xff0c;我们需要考虑的是否确定偷取这个房屋&#xff0c;如果确定偷取这个房屋&#xff0c;那么我们将得到房屋i的金…

QT-QPainter实现一个动态充电的电池

1、效果 2、核心代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>

php反序列化的一些知识

问题 <?php $raw O:1:"A":1:{s:1:"a";s:1:"b";}; echo serialize(unserialize($raw)); //O:1:"A":1:{s:1:"a";s:1:"b";}?> php反序列化的时按理说找不到A这个类&#xff0c;但是他没有报错&#xff0c;…

SpringBoot复习

第一章 SpringBoot开发入门 1.Springboot的优点。 ① 可快速构建独立的Spring应用。 ② 直接嵌入Tomcat、Jetty和Undertow服务器&#xff08;无须部署WAR文件&#xff09; ③ 通过依赖启动器简化构建配置 ④ 自动化配置Spring和第三方库 ⑤ 提供生产就绪功能 ⑥ 极少的代码生成…

使用Docker Compose运行Elasticsearch

使用Docker Compose运行Elasticsearch可以帮助你快速搭建和管理Elasticsearch服务。以下是具体步骤&#xff1a; 1. 安装Docker和Docker Compose 确保你已经安装了Docker和Docker Compose。如果没有安装&#xff0c;可以参考官方文档进行安装&#xff1a; Docker安装指南Doc…

永久更改R包的安装目录

要永久更改 R 包的安装目录&#xff0c;可以通过设置 R 配置文件来实现。以下是步骤说明&#xff1a; 1. 查找和修改 R 配置文件 R 有几个配置文件用于保存用户和系统的设置&#xff1a; 用户级配置文件&#xff1a;通常位于 ~/.Rprofile系统级配置文件&#xff1a;通常位于…