前言
python中的文件操作对于自动化或者脚本和数据之间的联动是使用非常频繁的操作,因此学号I/O流的操作至关重要,能够将想要操作的数据存在文件中,在python使用时直接调用就行,在此记录重要知识点。
简介
文件I/O流指对文件的输入输出操作(input、output),比如打开文件、读取数据、追加数据、插入数据、删除数据、关闭文件、删除文件等。
open()函数
# 打开一个文件,并返回文件对象。
open(文件路径, mode="对文件的操作方式"[, encoding]): 打开文件获取文件的对象。#操作文本文档时,必须指定编码。操作二进制相关的文件不能指定编码。
文件的操作方式/模式
- r: 只读文件内容,文件必须存在
- r+: 可读可写,文件必须存在, 先写,从文件开始向后写入。先读在写,默认写在文件的末尾。正常读。
- w: 只写,如果文件不存在,会创建一个新的文件. 注意:如果打开一个已存在的文件时,会将文件的内容全部覆盖。
- w+: 可读可写,如果文件不存在,会创建一个新的文件. 注意:如果打开一个已存在的文件时,会将文件的内容全部覆盖。读取时读不到任何内容。
- a: 追加的写,如果文件不存在,会创建一个新的文件。注意:a的模式,文件的指针默认在文件的末尾,写时会将内容默认写入到文件的末尾。
- a+: 可读可写,如果文件不存在,会创建一个新的文件。注意:a的模式,文件的指针默认在文件的末尾,读取不到任何内容。
- x: 只写,文件不能存在,如果文件存在报错,会创建新的文件。
- x+: 可读可写,文件不能存在,如果文件存在报错,会创建新的文件, 新的文件读取时没有任何内容。
- b: 如果读写二进制相关文件时,使用b,使用b时,读取时的返回值类型为bytes类型, 写入时,数据必须为bytes类型。
注意:这样组合起来有16中模式能够使用,但正常情况下只会使用r、a,文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容。
调用文件属性
执行 file = open(filename),成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性和方法为:
- file.name:返回文件的名称;
- file.mode:返回打开文件时,采用的文件打开模式;
- file.encoding:返回打开文件时使用的编码格式;
- file.closed:判断文件是否己经关闭。
- read():读文件
- write():写文件
- close():关闭文件
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close()方法:file.close(),不关闭的话,相当于文件一直被占用,会影响后续的移动、删除等操作,且造成内存资源浪费。
读取文件
文件对象提供了如下方法来读取文件中的内容:
- read():按照字节或字符读取文件内容,到底是读取字节还是字符,则取决于是否使用了b模式。如果使用了b模式,则每次读取一个字节;如果没有使用b模式,则每次读取一个字符。
- 在调用该方法时可传入一个整数作为参数,用于指定最多读取多少个字节或字符,比如read(1)表示读取一个字节或字符。
- 如果在调用read()方法时不传入参数,该方法默认会读取全部文件内容。
- readline([length]):默认读取文件中一行内容,返回值为字符串,可以传入参数n,比如readline(5)表示读取此行内的n个字符
- readlines(): 默认读取文件的全部内容, 返回值为列表,文件中每行的内容为列表的一个元素,元素的类型为字符串。
- readable(): 是否可读,如果可读返回True,如果不可读返回False
写入文件
- writable(): 是否可写,如果可写返回True,如果不可写返回False
- write("字符串"):写入字符串或字节串,不使用二进制模式打开的文件需要写入字符串,使用二进制模式(b)打开的文件需要写入bytes对象。
- writelines(列表):将列表中的元素写入到文件中,列表的元素必须为字符串。
注意:write、writelines同时写时,会公用一个文件指针
上下文管理器
我们都知道打开文件方式使用open()函数,再对文件操作完成后需要调用close()方法来关闭文件。实际上Python提供了with语句来管理资源关闭,比如可以把打开的文件放在with语句中,这样with语句可以帮我们自动关闭文件。
with open("文件路径", mode="模式") as f:
注意:with实现的原理要涉及到另外一个概念,就是上下文管理器(Context Manager)。所谓上下文管理器,就是实现了__enter__()和__exit__()方法的对象。上下文管理器对象可以使用with关键字。
bytes类型
bytes被称为字节串,是Python 3.x 新增的类型,在Python 2.x 中是不存在的。bytes 只负责以字节序列的形式(二进制形式)来存储数据,至于这些数据到底表示什么内容(字符串、数字、图片、音频等),完全由程序的解析方式决定。
字节串(bytes)和字符串(str)的对比:
- bytes 也称字节序列,并非字符,输出的时候最前面会有字符b修饰;str是python中字符串类型;
- str经过编码encode,转化成二进制对象,给计算机识别;bytes经过解码decode,转化成str,让我们看。
与字符串的转换
# 创建一个bytes对象
bytes_1 = bytes("Python is the most popular language", encoding="utf-8")
print("bytes_1:", bytes_1)
bytes_2 = bytes('面向对象的高级语言', encoding='utf-8')
print("bytes_2:", bytes_2)
# 字符串转为bytes
str1 = "今天天气不错哦"
bytes_3 = str1.encode('utf-8')
print("bytes_3:", bytes_3)
# bytes转为字符串方法一
str2 = str(bytes_3, 'utf-8')
print('str2:', str2)
# bytes转为字符串方法二
str3 = bytes_3.decode('utf-8')
print('str3:', str3)

Comments NOTHING