Python 文件操作

1、文件是什么

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

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

在 Windows “此电脑” 中看到的内容都是文件:

通过文件的后缀名可以看到文件的类型。常见的文件的类型如下:(数据都是保存在硬盘上的)

  • 文本文件(文本:txt,表格:xlsx)
  • 可执行文件(exe,dll)
  • 图片文件(图片:jpg,gif)
  • 视频文件(电影:mp4,歌曲:mp3,mov)
  • office 文件(.ppt,docx)
  • ... ...

存储器包含内存(空间更小、访问速度快、成本更高、数据易失)和外存(主要体现:硬盘(空间更大、访问速度慢、成本便宜、数据持久化存储)),变量在内存中;文件在硬盘中。

下面主要研究最简单的文本文件。

2、文件路径

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

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

为了方便确定一个文件所在的位置,使用文件路径(一层层目录构成的字符串)来进行描述。

知道了文件路径就可以知道这个文件在硬盘中的详细位置,也就可以进一步知道这个文件里面有什么了。

文件路径也可以视为是文件在硬盘上的身份标识,每个文件对应的路径都是唯一的。

例如,前面截图中的 QQ.exe 这个文件,可以使用路径来描述这个文件的位置:D:\program\qq\Bin\QQ.exe 来表示。

  • D: 表示盘符,不区分大小写。
  • 每一个 \ 表示一级目录。当前 QQ.exe 就是放在 “D 盘下的 program 目录下的 qq 目录下的 Bin 目录中”。
  • 目录之间的分隔符可以使用 \ 也可以使用 /,一般在编写代码的时候使用 / 更方便,因为有些情况下 \ 有特殊含义,表示 “转义字符”。

上述以盘符开头的路径,称为绝对路径。

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

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

3、文件操作

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

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

(1)打开文件

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

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

open 的返回值是一个文件对象,此处的文件对象就是内存上的一个变量,就像一个 “遥控器” 一样。在计算机中,把这样远程操控的 “遥控器” 称为 “句柄”(handler)。 

  • 第一个参数是一个字符串,表示要打开的文件路径。
  • 第二个参数是一个字符串,表示打开方式。其中,r 表示按照读方式打开,w 表示按照写方式打开,a 表示追加写方式打开。
  • 如果打开文件成功,返回一个文件对象,后面的读写文件操作都是围绕这个文件对象来进行操作的。
  • 如果打开文件失败(比如路径指定的文件不存在),就会抛出异常。

(2)关闭文件

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

f.close()

 注意:使用完毕的文件要记得及时关闭。

A. 一个程序能同时打开的文件个数,是存在上限的

如上面代码所示,如果一直循环的打开文件,而不去关闭的话,就会出现上述报错。

当一个程序打开的文件个数超过上限,就会抛出异常。

在系统中是可以通过一些设置项来配置能打开文件的最大数目。但是无论配置多少,都不是无穷无尽的,所以都需要记得及时关闭,释放资源。

文件资源泄露是一个蛮严重的问题,因为它不会第一时间暴露出来,而是在我们不注意的时候突然 “偷袭” 一下。

注意上述代码中,使用一个列表来保存了所有的文件对象。如果不进行保存,那么 Python 内置的垃圾回收机制(GC),会在文件对象销毁的时候自动关闭文件。

但是由于垃圾回收操作不一定及时,所以我们写代码仍然要考虑手动关闭释放,尽量避免依赖自动关闭

正确写法:

每个程序在启动时都会默认打开三个文件:

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

(3)写文件

文件打开之后 就可以写文件了:

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

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

A. 如果是使用 'r' 方式打开文件,则写入时会抛出异常

  • 使用 'w' 一旦打开文件成功,就会清空文件原有的数据内容。
  • 使用 'a' 实现 “追加写”,此时原有内容不变,写入的内容会追加在之前文件内容的末尾

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

(4)读文件 

 A. 读文件内容需要使用 'r' 的方式打开文件

使用 read 方法完成读操作,参数表示 “读取几个字符”。

计算机表示中文的时候,会采取一定的编码方式,称为 “字符集”。所谓 “编码方式”,本质上就是使用数字表示汉字。

中文和英文类似,在计算机中都是使用 “数字” 来表示字符的。哪个数字对应哪个汉字,在计算机中可以有多个版本。计算机只能表示二进制数据。要想表示英文字母,或者汉字,或者其他文字符号,就都要通过编码。最简单的字符编码就是 ASCII,使用一个简单的整数就可以表示英文字母和阿拉伯数字。但是要想表示汉字,就需要一个更大的码表。在实际开发的过程中,必须要保证文件本身的编码方式和 Python 代码中读取文件使用的编码方式匹配,才能避免出现上述问题。一般常用的汉字编码方式主要是:GBK 和 UTF-8。(相比于 gbk,utf8 是使用更广泛的编码方式)

Python3 中默认打开文件的字符集跟随系统,而 Windows 简体中文版的字符集采用了 GBK,所以如果文件本身是 GBK 的编码,直接就能正确处理。如果文件本身是其他编码(比如 UTF-8),那么直接打开就可能出现上述问题。

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

  • 如果此处的编码为 ANSI,则表示 GBK 编码
  • 如果此处为 UTF-8,则表示 UTF-8 编码

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

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

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

先构造一个多行文件:

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

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

end 参数就表示每次打印之后要在末尾加什么,原先默认是 '\n',修改成 '',也就是什么都不加。

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

 4、使用上下管理器

打开文件之后是容易忘记关闭的,Python 提供了上下文管理器来帮助我们自动关闭文件。

使用 with 语句打开文件。当 with 内部的代码块执行结束后,就会自动调用 f 的 close 关闭方法。

C++ 中的智能指针、Java 中的 try with Resources 和 Golang 中的 defer 都有类似效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值