文件就像一个仓库,可以存储各种类型的数据。根据用途可以将文件分为数据库文件、图像文件、音频文件、视屏文件、文本文件等。
文本文件
在文本文件中存储的是常规字符串,由文本行组成,每行通常由换行符 "\n" 结尾
对于文本文件来说,通常的操作流程为打开文件并创建对象,对该文件内容进行读取、写入、删除、修改等操作,关闭并保存文件
打开并创建对象
在 python 中内置了文件对象,通过 open () 函数就可以指定模式打开指定文件,并创建文件对象
该函数格式如下:
1 | open(file[,mode='r'[,buffering=-1]]) |
其中各个参数意义如下:
file:指定要打开或者创建的文件的名称,如果该文件不存在于当前目录中,则需要明确指出绝对路径。
mode:指定打开文件后的处理方式,其中包括读模式、写模式、追加模式、二进制模式、文本模式、读写模式等
**buffering:** 指定读写文件的缓冲模式,数值为 0 表示不缓存,数值为 1 表示使用行缓存模式,数值大于 1 表示缓冲区的大小,默认值为 - 1。二进制文件和非交互文本文件以固定大小的块为缓冲单位,等价于 io
对文件内容进行操作
对文件内容进行的操作包括:文件的读取、写入、追加,以及设置采用二进制模式、文本模式、读写模式等
(1) 向文本文件中写入内容
如果需要向文本文件中写入内容,在打开文件时就需要指定文件的打开模式为写模式
应根据不同的需求选取不同的写入模式:
w:写入模式。如果文件已存在,则先清空文件内容;如果文件不存在,则创建文件
x:写入模式。创建新文件,如果文件已存在,则抛出异常
a:追加模式。也是写入模式的一种,不覆盖文件的原始内容
例如创建一个 demo 文件并写入 "Hello world"
代码:
1 | s = "Hello world" |
运行之后能发现路径下出现一个 demo.txt,里面便是 Hello world
再例如,在已经存在的 demo.txt 中写入 Hello
China,并且不清空原始内容,则可以使用追加模式,即用 a 模式打开文件
代码:
1 | s = "Hello China" |
打开 txt,发现追加成功
(2) 读取文件中的内容
有时需要加载文本中的某行或者全部内容,就需要用到读取操作
r:读模式(默认模式,可以省略),如果文件不存在,则抛出异常
+:读写模式(可与其他模式组合使用)
例如读取 demo.txt 中的第一行的操作:
代码:
1 | f = open('demo.txt','r') |
输出:
1 | Hello worldHello China |
手动在 demo.txt 中换行添加内容,这里直接添加 111111111
代码:
1 | f = open('demo.txt','r') |
输出:
1 | Hello worldHello China |
关闭文件对象
当操作完文件内容之后,一定要关闭文件对象,这样才能确保所作的修改都保存到了文件当中
1 | f.close() |
文件操作基本遵循 "打开 -> 读写 -> 关闭" 的流程,但是如果文件读写操作代码引发了异常,就很难保证文件能够被正常关闭。可以使用上下文管理关键字 with 来避免产生这个问题。with 能够自动管理资源,总能保证文件正确关闭,并且可以在代码执行结束后自动还原开始执行代码块时的现场
代码:
1 | b = 'bbb' |
查看 demo.txt 成功添加
另外可以指定是以文本模式还是二进制模式进行处理
"t" - 文本 - 默认值。文本模式。
"b" - 二进制 - 二进制模式(例如图像)。
这些知道了就可以来进行一下实战应用,可以看下 misc 比较常见的考点,16 进制的翻转
先拿一张正常的图片
用 winhex 来查看下图片的头和尾
发现都是没有问题的,那就开始使用 python 进行翻转
首先我们先以二进制形式打开读取这张图片,将其存入到变量 x 中
1 | with open('cat.jpg','rb') as f: |
再对存入 x 中的内容进行翻转,将其存入到变量 re 中
1 | re = x[::-1] |
最后以二进制的形式创建打开写入一个 new 文件中
1 | with open('new','wb') as f: |
这样就实现了图片的 16 进制翻转,将 new 文件拖入 winhex 查看一下头尾
按 16 进制位成功翻转,如果想实现将 16 进制数值从头到尾全部翻转的话可以将图片的 16 进制进行复制使用文本形式打开文件,这里将 16 进制存入 re.txt 中
1 | with open('re.txt','r') as f: |
同样进行翻转
1 | re = x[::-1] |
这里的写入需要注意一个问题,可能会报错
TypeError: a bytes-like object is required, not 'str'
当文本写成一个文件的时候是需要将 str 类型的数据转换为 byte 类型的数据的,因此,在写入的时候需要加上类型的转换
1 | with open('new','wb') as f1: |
再来看看 new 文件的 16 进制头尾
发现确实是一种文本格式的翻转了,而不是 16 进制位的翻转
同样的,将该代码以同样的形式可以翻转成为一张正常的图片
代码:
1 | with open('re.txt','r') as f: |
成功还原小猫的图片