12.python基础学习-文件读写IO操作、json序列号与反序列化,json写入文件

修订日期 内容
2021-2-16 初稿

文件相关IO操作

打开文件模式(open mode)API

模式 说明
r 只读,默认
a 文件不存在新建、存在则追加内容
w 写入模式,文件不存在新建,会清空之前的内容
x 只能一次写入由程序自己新建的文件
rb 读取二进制文件,如图片
wb 写入二进制文件,如图片

读写(文本)文件

# 测试读取文件
file_name = 'D:\python\project\one\io\\file_text.txt'
file = open(file_name, encoding='utf-8')
print(file.read())
file.close()  # 关闭流


# 写入文件  mode = ‘w’ 标示清空内容再写入,
file = open(file_name,'w',encoding='utf-8')
file.write('python in java 2021 你好')
file.close()

# 写入文件 mode = ‘a’ 文件不存在则新建,不会覆盖源文件内容,以追加的方式写入文件
file = open(file_name,'a',encoding='utf-8')
file.write('\n')
file.write('python in java 2021 你好 again')
file.close()

# 测试mode = x  第一次新建成功,不删除文件运行第二次则报错
with open('new_file_02.txt','x',encoding='utf-8') as f:
    f.write('hello python 2021 新年快乐')

with open() as f 自动关闭IO流

每次都关闭流挺累的,java都有这种主动关闭的操作,想必python肯定也会有吧!

with open(file_name, encoding='utf-8') as rf, open(file_name2,encoding='utf-8') as wf:
    print(rf.read())
    print(wf.read())

读写二进制文件(复制图片-测试mode=rb,wb)

# 复杂图片测试rb与wb
image_name = '2021ox.jpg'
image_name_bak = '2021ox_bak.jpg'

with open(image_name, 'rb') as rf, open(image_name_bak, 'wb') as wf:
    wf.write(rf.read())

读取文件read的多种方式API

方法 描述
read() 一次性读取完整
read(size) 部分读写,指定读取大小
readline(limit) 一行一行读取,limit:读取的最大字符数,不写默认整行读完
readlines() 功能与readline()相似,返回的是一个列表list,list中的每一个元素为每一行的数据

read(size)、readlines() 例子

file_name = 'longtext.txt'
buff_size = 10
read_data = []
with open(file_name,encoding='utf-8') as rf:
    while True:
        data = rf.read(buff_size)
        read_data.append(data)
        if not data:
            break

print(''.join(read_data))

# readlines() 
with open(file_name,encoding='utf-8') as rf:
    read_lines_data = rf.readlines()

print(read_lines_data)
print(''.join(read_lines_data))

JSON 相关操作

将dict或list序列化成json字符串并保存文件

import json
original_data= {
    
    'key':'p', 'name':'python','desc':'脚本语言'}
# original_data= [{'key':'p', 'name':'python','desc':'脚本语言'},{'key':'j', 'name':'java','desc':'高级语言'}]

# 将字典dict序列化成json字符串
json_data = json.dumps(original_data,ensure_ascii=False)
print(type(json_data))  # <class 'str'>
print(json_data)  # {"key": "p", "name": "python", "desc": "脚本语言"}

file_name = 'language.json'

# 将json数据写入文件-写入的是str(不推荐)
with open(file_name,'w',encoding='utf-8') as wf:
    wf.write(json_data)
    
# 直接将dict或list 直接写入对象(推荐)
with open(file_name,'w',encoding='utf-8') as wf:
    json.dump(original_data,wf, ensure_ascii=False)

读取文件中的json数据反序列化成dict或list

# 从文本文件中读取json数据-先读文本在反序列化(不推荐)
with open(file_name,'r',encoding='utf-8') as rf:
    file_data = rf.read()
data = json.loads(file_data)
print(type(data))  # <class 'dict'>
print(data)  # {'key': 'p', 'name': 'python', 'desc': '脚本语言'}

# 从文本文件中读取json数据-直接读取(推荐)
with open(file_name,'r',encoding='utf-8') as rf:
    data = json.load(rf)
    print(type(data))
    print(data)

# 反序列化 json字符串 -> 字典
decode_data = json.loads(json_data)
print(type(decode_data))  # <class 'dict'>

python中自定义对象与json的相互转换(待完善)

总体思路:
获取对象的__dict__,这时候参考上面的例子dict <–> json

  • 待完善

おすすめ

転載: blog.csdn.net/weixin_48470176/article/details/113821261