【Python】6.基础语法(6)文件

news2024/9/20 20:33:49

文章目录

  • 1. 文件是什么
  • 2. 文件路径
  • 3. 文件操作
    • 3.1 打开文件
    • 3.2 关闭文件
    • 3.3 写文件
    • 3.4 读文件
  • 4. 关于中文的处理
  • 5. 使用上下文管理器


1. 文件是什么

变量是把数据保存到内存中。如果程序重启/主机重启, 内存中的数据就会丢失。

要想能让数据被持久化存储, 就可以把数据存储到硬盘中。也就是在文件中保存。

通过文件的后缀名, 可以看到文件的类型。

常见的文件的类型如下:

文本文件 (txt)

可执行文件 (exe, dll)

图片文件 (jpg, gif)

视频文件 (mp4, mov)

office 文件 (ppt, docx)


2. 文件路径

一个机器上, 会存在很多文件, 为了让这些文件更方面的被组织, 往往会使用很多的 “文件夹”(也叫做目录) 来整理文件。

实际一个文件往往是放在一系列的目录结构之中的。

为了方便确定一个文件所在的位置, 使用 文件路径 来进行描述。

d8f75a54feba39b34e8ee1235dc5d58f

例如, 上述截图中的 QQ.exe 这个文件, 描述这个文件的位置, 就可以使用路径C:\Program Files\Tencent\QQNT\QQ.exe来表示。

  • C: 表示 盘符,不区分大小写。

  • 每一个 \ 表示一级目录。当前 QQ.exe 就是放在 C 盘下的 Program Files 目录下的 Tencent 目录下的 QQNT目录中。

  • 目录之间的分隔符, 可以使用 \ 也可以使用 / 。一般在编写代码的时候使用 / 更方便,因为存在转义字符。

上述以 盘符 开头的路径, 我们也称为 绝对路径

除了绝对路径之外, 还有一种常见的表示方式是 相对路径。相对路径需要先指定一个基准目录, 然后以基准目录为参照点, 间接的找到目标文件。

描述一个文件的位置, 使用 绝对路径 和 相对路径 都是可以的。对于新手来说, 使用绝对路径更简单更好理解, 也不容易出错。


3. 文件操作

要使用文件, 主要是通过文件来保存数据, 并且在后续把保存的数据读取出来。

但是要想读写文件, 需要先 “打开文件”, 读写完毕之后还要 “关闭文件”。

3.1 打开文件

使用内建函数 open 打开一个文件.

f = open('d:/test.txt', 'r')
print(f)
print(type(f))

打印:

<_io.TextIOWrapper name='d:/test.txt' mode='r' encoding='cp936'>
<class '_io.TextIOWrapper'>

第一个参数是一个字符串, 表示要打开的文件路径

第二个参数是一个字符串, 表示打开方式。

r 表示read按照读方式打开

w 表示write按照写方式打开

a 表示append追加写方式打开,把内容写到原有文件内容的末尾。

如果打开文件成功, 返回一个文件对象。后续的读写文件操作都是围绕这个文件对象展开。

如果打开文件失败(比如路径指定的文件不存在), 就会抛出异常。

5c6aab7e0a02d3e8e45053a7e4168173

open的返回值是一个文件对象。

文件的内容是在硬盘上的,此处的文件对象,是内存上的一个变量。

后续读写文件操作,都是拿着这个文件对象来进行操作的。


3.2 关闭文件

使用 close 方法关闭已经打开的文件。

f = open('d:/test.txt', 'r')
print(f)
print(type(f))

f.close()

使用完毕的文件要记得及时关闭!

因为打开文件,实际上是在申请一定的系统资源,不再使用文件的时候,资源就应该及时释放。

正因为一个系统的资源是有限的,所以一个程序能同时打开的文件个数, 是存在上限的。

flist = []
count = 0
while True:
    f = open('d:/test.txt', 'r')
    flist.append(f)
    count += 1
    print(f'count = {count}')

打印:

9dfdd7f12eebb31cde627a1de0fc7fc6

如上面代码所示, 如果一直循环的打开文件, 而不去关闭的话, 就会出现上述报错。当一个程序打开的文件个数超过上限, 就会抛出异常。

注意: 上述代码中, 使用一个列表来保存了所有的文件对象:flist.append(f)

如果不进行保存, 那么 Python 内置的垃圾回收机制, 会在文件对象销毁的时候自动关闭文件。但是由于垃圾回收操作不一定及时, 所以我们写代码仍然要考虑手动关闭, 尽量避免依赖自动关闭。

8189+3=8192=2^13

为什么要加3呢?

因为每个程序在启动的时候,都会默认打开3个文件:

  1. 标准输入:键盘 input
  2. 标准输出:显示器 print
  3. 标准错误:显示器

3.3 写文件

文件打开之后, 就可以写文件了。

写文件, 要使用写方式打开, open 第二个参数设为 ‘w’。使用 write 方法写入文件。

f = open('d:/test.txt', 'w')
f.write('hello')
f.close()

打印:

9ef99e6edcf6dfb21cfc0486350829dc

用记事本打开文件, 即可看到文件修改后的内容。

db4336afa03f48a3c9ad0c9bc28c0eac


如果是使用 ‘r’ 方式打开文件, 则写入时会抛出异常。

f = open('d:/test.txt', 'r')
f.write('hello')
f.close()

打印:

efdc027ece1dd564c93280000507a5d3


使用 ‘w’ 一旦打开文件成功, 就会清空文件原有的数据。

使用 ‘a’ 实现 “追加写”, 此时原有内容不变, 写入的内容会存在于之前文件内容的末尾。

f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
f = open('d:/test.txt', 'a')
f.write('world')
f.close()

打印:

82e1a57db55f727f30bec176fd3ad9ed


针对已经关闭的文件对象进行写操作, 也会抛出异常。

f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
f.write('world')

打印:

7a4a96926a1e45db69fbdf1f7009daa5


3.4 读文件

读文件内容需要使用 ‘r’ 的方式打开文件,使用 read 方法完成读操作。参数表示 “读取几个字符”

f = open('d:/test.txt', 'r')
result = f.read(2)
print(result)
f.close()

打印:

he

注意:

这里读取的是两个字符而不是两个字节,所以即使是汉字也是读取两个汉字。


如果文件是多行文本, 可以使用 for 循环一次读取一行。

先构造一个多行文件。

b78c61f76a9f30f2df7fef374522c4ad

代码:

f = open('d:/test.txt', 'r')
for line in f:
    print(f'line = {line}')
f.close()

打印:

line = hello

line = world

line = !

注意:

由于文件里每一行末尾都自带换行符, print 打印一行的时候又会默认加上一个换行符, 因此打印结果看起来之间存在空行。

我们可以使用 print(f'line = {line}', end='') 手动把 print 自带的换行符去掉。


使用 readlines 直接把文件整个内容读取出来, 返回一个列表。每个元素即为一行。

b78c61f76a9f30f2df7fef374522c4ad

f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()

打印:

['hello\n', 'world\n', '!']

此处的 \n 即为换行符。


b8ddc3ac2c37b4e8503d96089f532421

f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()

打印:

['helloworld\n', '!']

此处的 \n 即为换行符。


f7f69c00c0ec1293e61521282acfeb03

f = open('d:/test.txt', 'r')
lines = f.readlines()
print(lines)
f.close()

打印:

4c1d03bdf47ea375b56ec888ba52f4e1

这个是因为记事本里面使用的不是gbk编码,而是UTF-8编码。

fdf2e2b4b5fd13ae77f77398af514336

我们需要添加一段代码:encoding='utf8'(这个叫做关键字参数)

代码:

f = open('d:/test.txt', 'r', encoding='utf8')
lines = f.readlines()
print(lines)
f.close()

打印:

d11b8e50489334c5d7d338b76adbcf6e

此处的 \n 即为换行符。


4. 关于中文的处理

当文件内容存在中文的时候, 读取文件内容不一定就顺利。

同样上述代码, 有的同学执行时可能会出现异常,也有的可能出现乱码。

计算机表示中文的时候, 会采取一定的编码方式, 我们称为 “字符集”。

所谓 “编码方式” , 本质上就是使用数字表示汉字。

我们知道, 计算机只能表示二进制数据。要想表示英文字母, 或者汉字, 或者其他文字符号, 就都要通过编码。

最简单的字符编码就是 ASCII。使用一个简单的整数就可以表示英文字母和阿拉伯数字。

但是要想表示汉字, 就需要一个更大的码表。一般常用的汉字编码方式, 主要是 GBKUTF-8

必须要保证文件本身的编码方式, 和 Python 代码中读取文件使用的编码方式匹配, 才能避免出现上述问题。

Python3 中默认打开文件的字符集跟随系统, 而 Windows 简体中文版的字符集采用了 GBK, 所以如果文件本身是 GBK 的编码, 直接就能正确处理。

如果文件本身是其他编码(比如 UTF-8), 那么直接打开就可能出现上述问题。

使用记事本打开文本文件, 在 “菜单栏” -> “文件” -> “另存为” 窗口中, 可以看到当前文件的编码方式。

如果此处的编码为 ANSI , 则表示 GBK 编码。

如果此处为 UTF-8 , 则表示 UTF-8 编码。

此时修改打开文件的代码, 给 open 方法加上 encoding 参数, 显式的指定为和文本相同的字符集, 问题即可解决。

f = open('d:/test.txt', 'r', encoding='utf8')

PS: 字符编码问题, 是编程中一类比较常见, 又比较棘手的问题。需要对于字符编码有一定的理解, 才能从容应对。

可以参考腾讯官方账号发表的帖子, 详细介绍了里面的细节。 https://zhuanlan.zhihu.com/p/46216008


5. 使用上下文管理器

打开文件之后, 是容易忘记关闭的。例如:代码里面有条件判定,函数返回,抛出异常…

Python 提供了 上下文管理器 , 来帮助程序猿自动关闭文件。

  • 使用 with 语句打开文件。

  • with 内部的代码块执行完毕后, 就会自动调用关闭方法。

with open('d:/test.txt', 'r', encoding='utf8') as f:
    lines = f.readlines()
    print(lines)

打印:

['床前明月光\n', '疑是地上霜']

类似的操作在C++里面有智能指针java里面有try with ResourcesGolang里面有defer

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

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

相关文章

openGauss 之索引回表

一. 前言 ​ 在openGauss中如果表有索引信息&#xff0c;查询的谓词条件中又包含索引列&#xff0c;openGauss支持通过索引信息快速拿到需要访问元组的位置信息&#xff0c;然后直接到该位置上取出元组数据&#xff0c;称之为回表查询。如下所示&#xff0c;利用索引索引…

JS中this指向问题

首先&#xff0c;this的绑定和定义的位置无关&#xff0c;它的指向只和调用方式有关&#xff0c;this只有在运行时才知道指向谁。 一&#xff0c;默认绑定 默认绑定&#xff0c;也可以说是独立函数调用&#xff0c;这时this指向window。 function foo() {console.log(this) …

DataGrip数据迁移

第一步 第二步 第三步 第四步 选择你刚刚到处的文件即可

海信发布以旧换新举措,补贴力度、补贴链路、服务体验全面升级

9月7日&#xff0c;由中国家用电器商业协会主办的“海信全国十城联动以旧换新”发布会在北京举行。 据「TMT星球」了解&#xff0c;活动以“品质换新就选海信”为主题&#xff0c;旨在贯彻政府加大消费品以旧换新的战略部署&#xff0c;为我国家电行业绿色化、智能化、高端化高…

知名AIGC人工智能专家培训讲师唐兴通谈AI大模型数字化转型数字新媒体营销与数字化销售

在过去的二十年里&#xff0c;中国企业在数字营销领域经历了一场惊心动魄的变革。从最初的懵懂无知到如今的游刃有余&#xff0c;这一路走来&#xff0c;既有模仿学习的艰辛&#xff0c;也有创新突破的喜悦。然而&#xff0c;站在人工智能时代的门槛上&#xff0c;我们不禁要问…

最厉害顶尖新媒体营销专家培训讲师唐兴通谈数字营销社群营销私域运营大客户销售AIGC大模型创新思维数字化转型商业模式短视频内容社私域数字经济人工智能

​数字人工智能时代的营销进化&#xff1a;从临摹到自我革新 引言&#xff1a;从模仿到变革的时代拐点 中国企业在过去的几十年里&#xff0c;经历了从电子商务的初兴到搜索引擎营销&#xff0c;再到微博、微信以及短视频等多种数字营销形式的迅速发展。在这个过程中&#xf…

力扣最热一百题——最大子数组和

目录 题目链接&#xff1a;53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;动态规划 举例分析 时间复杂度 Java写法&#xff1a; C写法&#xff1a; 优化 总结 题目链接&#xff1a;53. 最大子数组和 …

「数学::质数」试除法 / Luogu P5736(C++)

概述 在质数的第一节我们来讲解试除法。 质数是指在大于1的自然数中只能被1和它自己整除的数。 我们可以利用这一除法性质对质数进行判定。 Luogu P5736&#xff1a; 输入 n 个不大于 10^5 的正整数。要求全部储存在数组中&#xff0c;去除掉不是质数的数字&#xff0c;依…

012.Oracle-索引

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文&#xff5c;华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定…

Differential Diffusion,赋予每个像素它应有的力量,以及在comfyui中的测试效果

&#x1f97d;原论文要点 首先是原论文地址&#xff1a;https://differential-diffusion.github.io/paper.pdf 其次是git介绍地址&#xff1a;GitHub - exx8/differential-diffusion 感兴趣的朋友们可以自行阅读。 首先&#xff0c;论文开篇就给了一个例子&#xff1a; 我们的方…

SpringBoot2:请求处理原理分析-RESTFUL风格接口

一、RESTFUL简介 Rest风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…

自定义TextView实现结尾加载动画

最近做项目&#xff0c;仿豆包和机器人对话的时候&#xff0c;机器人返回数据是流式返回的&#xff0c;需要在文本结尾添加加载动画&#xff0c;于是自己实现了自定义TextView控件。 源码如下&#xff1a; import android.content.Context import android.graphics.Canvas imp…

Java小程序案例:电子日历记事本

要点 菜单栏中提供编辑&#xff08;剪切、复制、粘贴&#xff09;、保存、打开等功能。使用类组件实现图形界面设计。基于图形界面的日历&#xff0c;用户可编辑或查看指定日期的日志内容。提供按钮实现月份的前后翻动。事件持久化到文件&#xff0c;可再次编辑保存 效果 程序…

【工具】使用 Jackson 实现优雅的 JSON 格式化输出

说明 在 Java 开发中&#xff0c;我们经常需要处理 JSON 数据。无论是从服务器端返回的数据&#xff0c;还是本地存储的数据&#xff0c;JSON 格式都因其轻量级和易于解析的特点而被广泛使用。当我们需要查看或调试 JSON 数据时&#xff0c;优雅、格式化的输出将大大提高我们的…

风控系统之指标回溯,历史数据重跑

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 回顾 默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01&#xff0c;Redis、Zset、模版方…

C++万字解读类和对象(上)

1.类的定义 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 为了区分成员变量&…

SprinBoot+Vue应急信息管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

远心镜头选型公式

在当今的机器视觉领域&#xff0c;远心镜头凭借其独特的远心光路设计以及超低畸变、高远心度和高景深等特点&#xff0c;成为尺寸测量和视觉对位中的得力工具。然而&#xff0c;如何进行快速而准确的选型呢&#xff1f;答案就在于选型公式&#xff1a;倍率 焦距 N.A.Sensor 尺…

移动端视频编辑SDK解决方案,AI语音识别添加字幕

对于众多Vlog创作者而言&#xff0c;繁琐的字幕添加过程往往成为提升内容质量的绊脚石。为了彻底改变这一现状&#xff0c;美摄科技凭借其深厚的AI技术积累与创新的移动端视频编辑SDK解决方案&#xff0c;推出了革命性的AI语音识别添加字幕功能&#xff0c;让视频创作更加高效、…