python基础文件读写和json/pickle

文本处理

  1. 打开文件,获得文件句柄并赋值给一个变量
  2. 通过句柄对文件进行操作
  3. 关闭文件
    简单打开一个文件
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的光标移动规则

  1. 默认每次使用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

各语言直接进行数据交换的桥梁
我们先设立一个情景,我们在玩游戏存档的时候,是将游戏的参数存到硬盘中。假设所需要的内容是以字典存入。
我们需要:

  1. 将字典变为字符串存入文件
  2. 读取内容,并恢复为字典
# 模拟一个字典
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'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值