文本处理
- 打开文件,获得文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
简单打开一个文件
f = open('hello_world.txt')
data = f.read()
print(data)
f.close()
可以指定编码方式,如果没有指定则为系统默认编码方式
f = open('hello_world.txt', 'r',encoding='gbk')
data = f.read()
print(data)
f.close()
文本读
f = open('hello_world.txt', 'r')
# print(f.readable())
# print(f.readline())
# 去掉换行
# print(f.readline(), end='')
# print(f.readline(), end='')
# 当读完后光标在末尾,则读不出内容
# data = f.read()
# print(f.readline())
# 从此可以看出内容,当读完时没有空行
data = f.readlines()
print(data)
f.close()
文本写
写的内容必须是字符串
# 写的权限没有读的权限,而且当文件存在清空源文件,不存在则创建文件
f = open('hello_world.txt', 'w')
print(f.writable())
print(f.readable())
f.close()
f = open('hello_world.txt')
data = f.read()
print(data)
f.close()
# 结果为
# 444444
# 44444
# 而使用请一段代码为空
f = open('hello_world1.txt', 'w')
# 这样不会换行,如果要求换行必须自己添加\n
f.write('hello wang\nhello joker\n')
# 不是写多行而是写一个列表
f.writelines(['jie\n','yasuo\n'])
f.close()
追加
# a模式只有写的功能,没有读的功能
f = open('hello_world1.txt', 'a')
print(f.writable())
print(f.readable())
f.write('end')
f.close()
# 注 f.tell可以知道光标所在位置(以字节为单位)
其他
r+
f = open('hello_world.txt', 'r+')
print(f.writable())
print(f.readable())
f.close()
# 它不具备w的特征:没有文件则不会创建新的文件
# r+ 具有写和读两种
f = open('hello_world.txt', 'r+')
#r+模式是在光标处修改内容
data = f.read()
print(data)
f.write('jokwer')
f.close()
# 结果
# jokwerjokwer
with
# with 可以不用close(),也可以打开多个文件
with open('hello_world.txt', 'r') as f,\
open('hello_world1.txt','r') as f2:
print(f.read())
print(f2.read())
案例:
用读写的方式复制一个文件
with open('hello_world.txt', 'r') as f,\
open('hello_world2.txt','w') as f2:
old_data = f.read()
f2.write(old_data)
b模式
with open('hello_world.txt','rb') as f:
data = f.read()
print(data)
print(data.decode('utf-8'))
print(data.decode('utf-8').encode())
# windows 中/r/n是一个换行
# decode将二进制转换为相应的规格,encode()将其转为二进制
f.close()
wb 的两种写入方式
with open('hello_world.txt', 'wb') as f:
f.write(bytes('hello',encoding='utf-8'))
f.write('hello'.encode('utf-8'))
f.encoding文件打开的编码方式
f = open('hello_world.txt', 'w',encoding='gbk')
print(f.encoding)
f.close()
.flush
从内存中刷进硬盘
当我们写入时是没有东西的,目前还在内存
当我们刷新后就会出现,写入硬盘
光标移动
除了read()是字符,其他的都是字节
截取-----f.truncate(),要有写的权限
f = open('hello_world.txt', 'r+')
f.truncate(10)
f.close()
# 注意如果是中文,要带上编码格式
# f = open('hello_world.txt', 'r+',encoding='utf-8')
seek的光标移动规则
- 默认每次使用seek都会从头开始移动
f = open('hello_world.txt', 'r',encoding='utf-8')
print(f.tell())
print(f.seek(3))
print(f.tell())
print(f.seek(3))
print(f.tell())
f.close()
seek的相对位置
f = open('hello_world.txt', 'rb')
print(f.tell())
print(f.seek(3, 1))
print(f.tell())
print(f.seek(3, 1))
print(f.tell())
f.close()
读取最后一行
f = open('hello_world.txt', 'rb')
data = f.readlines()
print(data[-1].decode('utf-8'))
f = open('hello_world.txt', 'rb')
# 提取最后一行
for i in f:
# 设置偏移量
offs = -5
while True:
f.seek(offs, 2)
data = f.readlines()
if len(data) > 1:
print('文件最后一行为:%s' %(data[-1].decode('utf-8')))
break
offs*=2
函数模块补充
json
各语言直接进行数据交换的桥梁
我们先设立一个情景,我们在玩游戏存档的时候,是将游戏的参数存到硬盘中。假设所需要的内容是以字典存入。
我们需要:
- 将字典变为字符串存入文件
- 读取内容,并恢复为字典
# 模拟一个字典
dic_game = {
'floor':100,
'blood':95,
'water':100,
}
# 转换为字符串
dic_game_string = str(dic_game)
print(type(dic_game_string))
# 写到文件中
f = open('json_game.txt', 'w')
f.write(dic_game_string)
f.close()
# 还原数据
f_read = open('json_game.txt', 'r')
data = f_read.read()
print(eval(data))
import json
# 模拟一个字典
dic_game = {
'floor':100,
'blood':95,
'water':100,
}
# 转换为字符串
data = json.dumps(dic_game)
print(data)
print(type(data))
# 字符串必须双引号
# 将数据改为字符串
# 写到文件中
f = open('json_new_game.txt', 'w')
f.write(data)
f.close()
# 还原数据
f_read = open('json_new_game.txt', 'r')
data = json.loads(f_read.read())
print(data)
print(type(data))
jump,和jumps差别是jump可以简化写入和读取的步骤
import json
# 模拟一个字典
dic_game = {
'floor':100,
'blood':95,
'water':100,
}
# 将数据改为字符串
# 写到文件中
f = open('json_new_game.txt', 'w')
json.dump(dic_game,f)
f.close()
# 还原数据
f_read = open('json_new_game.txt', 'r')
data = json.load(f_read)
print(data)
f_read.close()
pickle
import pickle
# 模拟一个字典
dic_game = {
'floor':100,
'blood':95,
'water':100,
}
print(type(dic_game))
data = pickle.dumps(dic_game)
print(type(data)) # <class 'bytes'>
# 导入一个文件
f = open('pickle_test.txt', 'wb')
f.write(data)
f.close()
# 读取文件
f_read = open('pickle_test.txt', 'rb')
data_read = pickle.loads(f_read.read())
print(data_read['floor'])