1 小序
1.0 功能
打开某个文件,创建一个file对象,调用相关方法进行读写.
1.2 格式:
open(name[, mode[, buffering]])
1.3 参数说明
序号 | 参数 | 描述 |
---|---|---|
1 | name | 文件名 |
2 | mode | 操作文件模式 |
3 | buffering | 寄存状态,buffering设为0,访问不寄存,为1访问文件寄存,如果为大于1的整数,表明寄存区的缓冲大小 |
1.4 文件操作模式
序号 | 模式 | 描述 |
---|---|---|
1 | r | 只读模式打开文件,文件的指针在文件开头,即从第一行第一列读取文件内容 |
2 | rb | 在二进制格式下以只读模式打开文件,,文件指针放在开头,即从第一行第一列读取文件内容 |
3 | r+ | 读写模式打开文件,文件指针在开头 |
4 | rb+ | 在二进制格式下以读写模式打开文件,文件指针在文件开头 |
5 | w | 以写模式打开文件,文件指针在文件开头,即从文件头开始编辑,原有内容被删除,如果文件不存在,会自动创建文件 |
6 | wb | 在二进制格式下以写模式打开文件,如果文件存在,从头开始编辑,原有内容被删除,文件不存在,自动创建文件 |
7 | w+ | 读写模式打开文件,文件存在,从头开始编辑,原有内容被删除,文件不存在,自动创建文件 |
8 | wb+ | 在二进制格式下以读写模式打开文件,从头开始编辑,原有内容被删除,文件不存在则自动创建文件 |
9 | a | 打开文件追加内容,如果文件存在,文件指针放在文件结尾,即继续先前的文件继续编辑,文件不存在,自动创建文件 |
10 | ab | 在二进制格式下追加文件内容,文件指针放在文件结尾,即继续先前的文件继续编辑,文件不存在,自动创建文件 |
11 | a+ | 以读写模式追加文件内容,文件指针在文件结尾,即继续先前的文件继续编辑,文件不存在,自动创建文件 |
12 | ab+ | 在二进制格式下追加文件内容,文件指针在文件结尾,即继续先前的文件继续编辑,文件不存在,自动创建文件 |
2 文件对象方法
序号 | 方法 | 描述 |
---|---|---|
1 | read([size]) | size未指定则返回整个文件,如果文件大小>2倍内存则出现问题,read()读到文件末尾是返回空字符"" |
2 | radline() | 按行读取数据,返回一行数据 |
3 | readlines([size]) | 按行读取数据,返回size行的数据列表,size未指定则返回全部行 |
4 | for line in f | 通过迭代器访问 |
5 | write(“string”) | 写入字符串数据,如果数据格式不是字符串,需要转为字符串格式 |
6 | tell() | 返回一个整数,表示当前文件指针的位置,即到文件起始位置的比特数 |
7 | seek(offset,[start]) | 移动文件指针,offset为偏移量,单位为bit,可正可负,start为起始位置,0表示文件开始,1当前位置,2文件末尾 |
8 | close() | 关闭文件 |
格式:
# 使用open模式,在文件操作完毕,自动关闭文件
# 避免f.close()忘记的问题
with open('test.txt', 'a') as f:
f.read()
f.readlines()
f.write("xindaqi")
3 案例
datas.txt文件内容
Allocation of 21299200 exceeds 10% of system memory
测试文件
并行操作
穿行操作
3.1 直接遍历open类
with open("./datas/datas.txt", "r") as f:
print("open class: {}".format(type(f)))
print("open value: {}".format(f))
for data in f:
print("data type: {}".format(type(data)))
print("data: {}".format(data))
- Result
包含换行符.
open class: <class '_io.TextIOWrapper'>
open value: <_io.TextIOWrapper name='./datas/datas.txt' mode='r' encoding='UTF-8'>
data type: <class 'str'>
data: Allocation of 21299200 exceeds 10% of system memory
data type: <class 'str'>
data: 测试文件
data type: <class 'str'>
data: 并行操作
data type: <class 'str'>
data: 穿行操作
- Analysis
(1) open打开文件得到的是IO装饰器类,通过for循环可对该类进行遍历;
(2) 遍历IO装饰器,获取每行数据(字符串);
3.2 文件单行读取
只读一行
with open("./datas/datas.txt", "r") as f:
data = f.readline()
print("data: {}".format(data))
- Result
包含换行符号.
data: Allocation of 21299200 exceeds 10% of system memory
按行读取所有文件
datas = []
with open("datas.txt", 'r') as f1:
# 按行读取数据
while true:
# 去除换行符号
a = f1.readline().strip('\n')
# 写入列表
datas.append(a)
# 读到文件最后一行,退出
if not a:
break
# 列表去除空值
while '' in datas:
datas.remove('')
- Analysis
(1) readline方法读取open类中的单行数据;
(2) 需要使用循环遍历每一行数据,将读取的数据存储到list中;
3.3 文件多行提取
with open("datas.txt", "r") as f:
datas = f.readlines()
print("datas: {}".format(datas))
- Result
datas: ['Allocation of 21299200 exceeds 10% of system memory\n', '测试文件\n', '并行操作\n', '穿行操作\n']
- Analysis
(1) readlines方法从open类中读取所有数据,并直接存储到list中,实现了readline的循环遍历+存储的功能;
(2) 对readlines方法提取的数据处理和对list处理一致;
3.4 直接读取read
with open("./datas/datas.txt", "r") as f:
datas = f.read().strip("\n")
print("datas: {}".format(datas))
for data in datas:
print("data: {}".format(data))
- Result
datas: Allocation of 21299200 exceeds 10% of system memory
测试文件
并行操作
穿行操作
data: A
data: l
data: l
data: o
data: c
...
data: 穿
data: 行
data: 操
data: 作
- Analysis
(1) read方法直接读取文件所有内容,作为一个字符串;
(2) 遍历该数据即是遍历一个字符串;
3.4 文件写入
# a模式接着上一次结果继续写入
datas = ['xindaqi', 'zhangwenwen']
with open("datas.txt", 'a') as f:
for data in datas:
# 换行写入
f.write(data+'\n')
4 总结
(1) with上下文管理器可对open的状态进行自动监管,当读取完成时可自动管理,无需使用close;
(2) 连续写入数据,使用a及可以实现在文件末尾操作的模式,列表去除空字节,使用remove;
(3) open数据提取有四种方法,直接遍历,read读取,readline读取,readlines读取,详见表4.1;
序号 | 遍历方法 | 描述 |
---|---|---|
1 | 直接遍历 | 使用循环按照行提取数据 |
2 | read | 将所有数据串成一个字符串,提取数据时按照字符串的操作方法 |
3 | readline | 按行读取数据,每次只读取一行,需要设置循环遍历 |
4 | readlines | 将所有数据按行读取,自动存储至list中,之后按照list操作 |
[参考文献]
[1]http://www.runoob.com/python/python-func-open.html
[2]https://www.cnblogs.com/hackpig/p/8215786.html