8.python文件

文章目录

大家好,我是晓星航。今天为大家带来的是 python文件 相关的讲解!😀

1.文件

1.1文件是什么

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

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

在 Windows "此电脑" 中, 看到的内容都是 文件.

通过文件的后缀名, 可以看到文件的类型. 常见的文件的类型如下:

  • 文本文件 (txt)
  • 可执行文件 (exe, dll)
  • 图片文件 (jpg, gif)
  • 视频文件 (mp4, mov)
  • office 文件 (.ppt, docx)
  • ...

1.2文件路径

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

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

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

例如, 上述截图中的 QQ.exe 这个文件, 描述这个文件的位置, 就可以使用路径

D:\program\qq\Bin\QQ.exe 来表示.

  • D: 表示 盘符. 不区分大小写.
  • 每一个 \ 表示一级目录. 当前 QQ.exe 就是放在 "D 盘下的 program 目录下的 qq 目录下的 Bin 目录中" .
  • 目录之间的分隔符, 可以使用 \ 也可以使用 / . 一般在编写代码的时候使用 / 更方便.

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

除了绝对路径之外, 还有一种常见的表示方式是 相对路径. 相对路径需要先指定一个基准目录, 然后以基准目录为参照点, 间接的找到目标文件. 咱们课堂上暂时不详细介绍.

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

1.3文件操作

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

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

1.3.1打开文件

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

python 复制代码
f = open('d:/test.txt', 'r')
  • 第一个参数是一个字符串, 表示要打开的文件路径
  • 第二个参数是一个字符串, 表示打开方式. 其中 r 表示按照读方式打开. w 表示按照写方式打开. a表示追加写方式打开,r+表示以读写方式打开.
  • 如果打开文件成功, 返回一个文件对象. 后续的读写文件操作都是围绕这个文件对象展开.
  • 如果打开文件失败(比如路径指定的文件不存在), 就会抛出异常.

1.3.2关闭文件

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

python 复制代码
f.close()

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

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

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

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

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

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

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

1.3.3写文件

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

  • 写文件, 要使用写方式打开, open 第二个参数设为 'w'如果文件不存在,会创建文件。
  • 'w+'读写模式,打开文件进行读写操作。文件会被截断(清空),如果文件不存在,会创建文件。
  • 使用 write 方法写入文件
python 复制代码
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()

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

  • 如果是使用 'r' 方式打开文件, 则写入时会抛出异常
python 复制代码
f = open('d:/test.txt', 'r')
f.write('hello')
f.close()
  • 使用 'w' 一旦打开文件成功, 就会清空文件原有的数据.
  • 使用 'a' 实现 "追加写", 此时原有内容不变, 写入的内容会存在于之前文件内容的末尾,如果文件不存在,会创建文件。
  • 'a+':追加和读写模式,以追加和读写模式打开文件。如果文件存在,新内容将追加到文件末尾;如果文件不存在,会创建文件。
python 复制代码
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()

f = open('d:/test.txt', 'a')
f.write('world')
f.close()
  • 针对已经关闭的文件对象进行写操作, 也会抛出异常.
python 复制代码
f = open('d:/test.txt', 'w')
f.write('hello')
f.close()
f.write('world')

1.3.4读文件

  • 读文件内容需要使用 'r' 的方式打开文件
  • 或使用'r+'读写的方式打开文件,文件必须存在,否则会引发 FileNotFoundError 异常。
  • 使用 read 方法完成读操作. 参数表示 "读取几个字符"
python 复制代码
f = open('d:/test.txt', 'r',encoding='utf-8')
result = f.read(2)
print(result)
f.close()

注:这里的硬盘位置写D或者d都可以,后面的编码方式写utf8 utf-8 UTF8 UTF-8 都可以,我们的编译器都会默认识别为utf-8的编码方式

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

先构造一个多行文件

python 复制代码
f = open('D:/code.txt', 'r',encoding='utf-8')
for line in f:
    print(f'line = {line}')
f.close()

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

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

python 复制代码
f = open('D:/code.txt', 'r',encoding='utf-8')
for line in f:
    print(f'line = {line}',end='')
f.close()
  • 使用 readlines 直接把文件整个内容读取出来, 返回一个列表. 每个元素即为一行.
python 复制代码
f = open('D:/code.txt', 'r',encoding='utf-8')
line = f.readlines()
print(line)
f.close()

此处的 \n 即为换行符.

1.4关于中文的处理

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

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

也有的同学可能出现乱码.

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

所谓 "编码方式" , 本质上就是使用数字表示汉字.

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

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

但是要想表示汉字, 就需要一个更大的码表.

一般常用的汉字编码方式, 主要是 GBK 和 UTF-8

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

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

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

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

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

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

python 复制代码
f = open('d:/test.txt', 'r', encoding='utf8')

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

1.5使用上下文管理器

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

  • 使用 with ... as语句打开文件.
  • 当 with 内部的代码块执行完毕后, 就会自动调用关闭方法.
python 复制代码
with open('D:/code.txt','r',encoding='utf-8')as f:
    result = f.readlines()
    print(result)

with 语句作用:

  • 当使用 with 语句时,在代码块执行完毕后,文件对象会自动关闭。这是通过上下文管理器实现的,文件对象实现了上下文管理器协议。无需手动调用 f.close() 方法,避免了因忘记关闭文件而导致的资源泄漏问题。
  • 即使在代码块内部发生异常,with 语句也能确保文件被正确关闭。
python 复制代码
try:
    with open('example.txt', 'r') as f:
        # 假设这里发生异常
        1 / 0
        content = f.read()
        print(content)
except ZeroDivisionError:
    print("An error occurred, but the file is still closed.")

在上述代码中,即使在读取文件内容之前发生了除以零的异常,文件对象 f 也会被自动关闭,因为 with 语句会在异常处理前确保文件关闭。

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

相关推荐
天赐范式1 分钟前
天赐范式第181天:让视图开始切换——PBFT视图切换与从safety到liveness的跨越
python·pbft·数字生命·天赐范式·动态运行时·拜占庭容错
sugarzhangnotes11 分钟前
【无标题】
开发语言·人工智能·python
weixin_4471952944 分钟前
【无标题】
pytorch·python
迅猛龙办公室1 小时前
Python实现简单的人名对话
python
阿坨1 小时前
firestart:一行命令启动你的日常应用和网页
python·pypi·cli·click
老歌老听老掉牙1 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
happylifetree2 小时前
Python18(补充):练习
python
weixin_416667962 小时前
银河麒麟V10看门狗试验-1
网络·chrome·python
古城小栈3 小时前
Pydantic 从入门到实践全讲解
python
happylifetree3 小时前
Python18:核心语法-数据存储与运算-运算符-算术运算符
python