文章目录
有几条逻辑先写在前面:
- 必须首先使用open函数,打开文件之后才有后续的write和read操作
- 需要在open函数中就定义好文件的使用用途(设置open函数的参数),比如读、写、还是读写、还是追加等等
- 指针的位置直接影响目标内容
本文章,主要从基本的打开、写、读和文件操作两个大的方向来进行小结。
1. 文件打开、写入、读取的简要概述
open函数
open()
函数是Python内置的函数,用来创建一个file对象,记住:有了file对象,相关的方法才可以调用它进行读写。
其基本用法为:fileObject = open(xx, x)
这里,xx代表要打开的文件,x指的是参数。
(以下都省略了打开的文件)
open(, r):只读,不创建
open(, r+):读 + 写,不创建
open(, w):只写
open(, w+):写 + 读
open(, a):追加方式写(不覆盖)
open(, a+):追加方式写 (不覆盖)+ 读
即,加号'+'
代表额外方式
附:open(, rb):只读,以二进制格式打开(非人工书写数据,如图片等)
注:
- w+与r+区别
r+
:可读可写,若文件不存在,报错;w+
: 可读可写,若文件不存在,创建
write函数
write() 方法用于向文件中写入指定字符串,用法:fileObject.write(str)
read函数
fileObject.read()
:text ——> one whole str
fileObject.readline()
:one line ——> one str
fileObject.readlines()
:all line ——> one list with all lines
指针与seek函数
指针会随你的读写操作而向后移动
open
文件之后,指针就在文件内容的起始位置write
函数之后,指针就在写入的内容之后read
函数之后,指针在读取的内容之后,
例如使用read(),则指针会从起始位置移动,直到文件的末尾
所以,如果发现获取的并非自己想取的内容,很可能就是因为指针的位置不对。
这种情况,就应该使用 seek()
来指定指针的位置。
注:seek(0)
指向开头
2. 简单例子
这里的例子详细的介绍了 write、read、readline和readlines的用法。
open函数的w模式
和w+模式
- 首次写入
# 首次写入
with open('write_files.txt', 'w') as f1:
f1.write('1 2 3\n4 5 6') # 只要没有退出文件,就可以连续写入
f1.write('7 8 9')
with open('write_files_w+.txt', 'w+') as f2:
f2.write('a b c\nd e f') # 只要没有退出文件,就可以连续写入
f2.write('g h i')
结果:
(文件中写入的内容)
- 再次写入
# 再次写入
with open('write_files.txt', 'w') as f1:
f1.write('w模式,重新写入...') # 再次写入会完全清空之前的文件
# w模式下使用read函数会导致报错(io.UnsupportedOperation: not readable),因为 w 模式不可 读取
#lines = f1.read()
#print(lines)
with open('write_files_w+.txt', 'w+') as f2:
f2.write('w+模式,重新写入...') # 再次写入会完全清空之前的文件
f2.seek(0) # 将经过write之后的指针移到文件开头
red = f2.read()
f2.seek(0) # 将经过read之后的指针移到文件开头
readline = f2.readline()
f2.seek(0) # 将readline()之后的指针移动到文件开头
readlines = f2.readlines()
print(f'read: {red}') # read()读取所有的内容,并且将其作为一个完整的字符串
print(f'readline: {readline}') # readline()只读取一行内容,且是字符串格式
print(f'readlines: {readlines}') # readlines()读取所有行,并将内容放在一个list里(注:由于这里总共只有一行,所以没有用到 for in 来遍历这个列表)
控制台打印结果:
read: w+模式,重新写入...
readline: w+模式,重新写入...
readlines: ['w+模式,重新写入...']
文件中写入的内容:
open函数的a模式和a+模式
在这里插入代码片
- a 模式
# 1. a 模式
with open('write_file_a.txt', 'a') as f1:
f1.write('x y z\n1 2 3')
# w模式下使用read函数会导致报错(io.UnsupportedOperation: not readable),因为 w 模式不可 读取
# lines = f1.read()
# print(lines)
结果:
- a+模式
# 2. a+模式
# 首次
with open('write_file_a+.txt', 'a+') as f2:
f2.write('A B C')
lines = f2.read() # 这里是没有东西打印出来的,因为指针现在在最后面
print(lines)
# 再次
with open('write_file_a+.txt', 'a+') as f2:
f2.write('1 2 3')
f2.seek(0) # 将指针移到头部
lines = f2.read()
print(lines)
打印结果:
A B C1 2 3
3. json模块
写入
import json
data_dic = {'name':'robin', 'age':18, 'city':"Shanghai"}
# text = json.dumps(data_dic) # json.dumps:字典 -> 文件字符串
# print(text)
f = open('demo.json', 'w') # 新建 json 文件
json.dump(data_dic, f) # json.dump :字典 -> JSON 文件
读取
- json.load:将已编码的json文件解码为python对象
f = open('demo.json', 'r', encoding='utf-8')
f_dic = json.load(f)
print(f_dic)
返回:{'name': 'robin', 'age': 18, 'city': 'Shanghai'}
4. 文件操作
4.1 返回文件和文件夹的名称:os.listdir()
具体来说,是返回目标路径下所有类型格式的文件和文件夹的名称(不是完整路径)的一个list类型。
例子:
import os, glob
cwd = os.getcwd()
print(f"cwd:{cwd}")
lstdir = os.listdir(cwd)
print(f"lstdir:\n{lstdir}")
结果:
lstdir:
['Alan.png', 'json_demo.py', '.DS_Store', 'demo.json', 'example.log', 'test.py', 'image_to_json.py', 'restful.py', 'data', 'alan.json', '.idea']
可以看出来,结果不仅有各种文件,还有文件夹,但都是名称而不是完整地址。
一定要要注意,Mac 中存在隐藏文件'.DS_Store'
,因此使用os.listdir()
要注意对结果进行一个过滤!
4.2 返回路径下的搜索结果:glob.glob()
具体来说,是输入指定匹配规则(Unix 终端所用规则)的搜索路径,返回目标结果的list类型(类似于Windows下的文件搜索)
例子:
import os, glob
cwd = os.getcwd()
print(f"cwd:{cwd}")
globdir = glob.glob(os.path.join(cwd, "*.py")) # 获取指定后缀文件的完整地址
print(f"globdir:\n{globdir}")
print()
for i in globdir :
file_name = os.path.split(i)[1] # 获取地址字符串最后面的文件名
print(f"file_name:{file_name}")
结果:
globdir:
['/Users/robin/MLcode/Pycharm_Project/tensorflow/0708_PythonRESTful/json_demo.py', '/Users/robin/MLcode/Pycharm_Project/tensorflow/0708_PythonRESTful/test.py', '/Users/robin/MLcode/Pycharm_Project/tensorflow/0708_PythonRESTful/image_to_json.py', ]
file_name:json_demo.py
file_name:test.py
file_name:image_to_json.py
小结:
- 使用
os.path.join()
合并路径和文件名为一个完整路径 - 使用
os.path.split()
从完整路径中分割出文件名 os.path.splitext()
:去除文件后缀
4.3 os.walk()
参考: