文件操作是编程中必不可少的, 配置文件, 数据存储都是对文件操作; 按文件操作与格式主要内容如下图:
文件基本操作为打开, 读取, 写入, 关闭, 我们按这个过程来详解讲解.
1. 一个例子搞定打开, 读取与关闭:
准备工作:
1 > 新建文件: E:\workdir\readme.txt(或者自己准备一个其他文本文件);
2 > 文件添加一行内容: this is test
直接上代码, 有个基本认识:
- # 文件路径
- path = r'E:\workdir\readme.txt'
- # 打开文件
- f = open(path)
- # 读取文件
- txt = f.read()
- print(txt)
- # 关闭文件
- f.close()
输出结果: this is test;
感觉文件操作太简单了.
那么问题来了: 如果文件不存在如何创建文件? 如何写文件? 这种方式能够写入吗?
我们来看文件打开方式.
2 文件打开方式详解:
2.1 open 方法详解:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
返回一个文件 IO 对象, 如果文件不存在或者打开出错触发异常;
主要参数:
参数 | 说明 |
---|---|
file | 文件路径 |
mode | 打开方式,默认只读方式 |
encoding | 打开文件编码格式 |
其他参数暂时使用默认值.
我们再来看下文件打开方式: | 打开方式 | 说明 |
---|---|---|
‘r‘ | 只读方式 ,不能写入 | |
‘w‘ | 只写方式打开,文件不存在创建文件,文件存在截断文件 | |
‘a‘ | 只写方式打开,如果文件存在,再文件尾部开始写入 | |
‘+‘ | 读写方式打开 | |
‘b‘ | 二进制方式打开,例如图片; ‘rb‘,‘wb‘,‘ab‘,上面操作类似 |
2.2 打开方式测试:
工作目录:'E:\workdir';
case1: 文件不存在创建文件:
- # 该文件不存在
- wfpath = r'E:\workdir\testw.txt'
- f = open(wfpath, 'w')
- # 写入一行
- f.write('python')
- f.close()
查看 E:\workdir\, 创建文件 testw.txt;
case2: 文件存在只写方式打开:
准备工作:
1 > 在'E:\workdir'下创建文件: test1.txt;
2 > 写入一行文本:'abcd1234';
测试:
- # 文件存在
- fpath = r'E:\workdir\test1.txt'
- f = open(fpath, 'w')
- f.close()
查看 r'E:\workdir\test1.txt', 内容被清空;
case3: 只写方式打开, 能否读取:
- fpath = r'E:\workdir\test1.txt'
- # 文件只写方式打开
- f = open(fpath, 'w')
- # 进行读取
- f.read()
- f.close()
结果:
- UnsupportedOperation Traceback (most recent call last)
- <ipython-input-13-30cd4bdc05f3> in <module>
- 3 fpath = r'E:\workdir\test1.txt'
- 4 f = open(fpath, 'w')
- ----> 5 f.read()
- 6 f.close()
- UnsupportedOperation: not readable
只写方式打开不能写入.
case4: 只写方式打开, 尾部开始写入:
使用'w'方式打开文件, 文件会被裁剪, 如何在尾部追加数据? 使用'a'模式:
- # 先写入 abc, 关闭重新打开文件, 在写入 123
- fpath = r'E:\workdir\testa.txt'
- # 只写方式打开
- f = open(fpath, 'w')
- f.write('abc')
- f.close()
- # 追加方式打开, 文件尾开始写入
- fpath = r'E:\workdir\testa.txt'
- f = open(fpath, 'a')
- f.write('123')
- f.close()
文件内容: abc123;
cast5: 读写方式打开:
模式 | 说明 |
---|---|
‘r+‘ | 读写方式打开,从文件头开始读写 |
‘r+‘ | 读写方式打开,文件被清空 |
‘a+‘ | 追加方式读写打开,从文件尾开始读写 |
- # 文件路径, 文件内容:'this is test'
- path = r'E:\workdir\readme.txt'
- # 打开文件
- f = open(path, 'r+')
- line = f.read()
- print(line)
- # 写入文本
- f.write('end')
- # 关闭文件, 文件尾写入 end
- f.close()
结果: 读取文件内容, 并在文件尾插入 end;
大家可以尝试测试另外两种读写模式.
3. 文件读取
读取文件方法:
方法 | 说明 |
---|---|
read(size=-1, /) | 读取指定字节或者读取完成,默认读取完 |
readline(size=-1, /) | 读取一行 |
readlines(hint=-1, /) | 读取多行,默认读取完,返回每行组成列表 |
环境准备: readme.txt 中添加四行:
: 语法
: 环境
: 逻辑处理
: 数据结构
case1: 一次读取完
- path = r'E:\workdir\readme.txt'
- f = open(path)
- lines = f.read()
- print(lines)
case2: 逐行读取
- path = r'E:\workdir\readme.txt'
- f = open(path)
- while True:
- #读取完, 读取内容为''
- line = f.readline()
- if line:
- print(line, end='')
- else:
- break
case3: 按行一次读完
- path = r'E:\workdir\readme.txt'
- f = open(path)
- lines = f.readlines()
- print(lines)
lines 为列表;
case4: 使用 for 循环逐行读取:
如果文件过大, 一次读取会占用大量内存, 所以一般情况下, 我们使用 for 遍历文件:
- path = r'E:\workdir\readme.txt'
- f = open(path)
- for line in f:
- print(line, end='')
4. 文件写入:
方法 | 说明 |
---|---|
write(text, /) | 写入字符串,返回写入字节数 |
writelines(lines, /) | 写入多行 |
实际操作:
- #'\n'换行符
- info = ['java\n','c++\n']
- # 只写方式打开文件
- path = r'E:\workdir\testw.txt'
- f = open(path,'w')
- # 写入一行
- f.write('python'+'\n')
- # 写入多行
- f.writelines(info)
- f.close()
到这里文件基本操作我们就介绍完了, 在专栏中我们再来看如何使用.
来源: http://www.bubuko.com/infodetail-2899944.html