python 高级用法 -- IO编程
Prerequisite
参考文章:廖雪峰的文章
文件读写
只记录平时用的比较多的
# wb / rb 二进制形式写入 / 读取
# b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
# a 追加形式写入
# open 函数中的参数
# encoding='gbk' 编码
# errors='ignore' 忽略文件中非法编码的字符
# 几种常用的读写方法
# read() 一次性读取文件的全部内容
# read(size) 每次最多读取 size 个字节的内容
# readline() 每次读取一行内容
# readlines() 一次读取所有内容并按行返回 list
# 自动调用 close 函数的读取方法
with open('file', 'r') as f:
print(f.read())
# 读取每一行
f = open('file', 'r')
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
f.close()
StringIO 和 BytesIO
从内存中读写数据,但对我没用,不记(硬气)
操作文件和目录
关于更多的 OS 标准库用法:Python 标准库之 os 模块详解
import os
import shutil
os.name # 操作系统类型
os.uname() # 获取详细的系统信息(Windows 不支持)
os.environ # 在操作系统中定义的环境变量
os.environ.get('PATH') # 获取某个环境变量的值
os.path.abspath('.') # 查看当前目录的绝对路径
'/Users/michael'
os.mkdir('/Users/michael/testdir') # 然后创建一个目录
os.rmdir('/Users/michael/testdir') # 删掉一个目录
# 想要查看当前操作系统的拼接方式
os.path.join(os.path.abspath('.'), 'temp')
'C:\\Users\\xxx\\temp'
# 想要合并 / 拆分路径
os.path.join() / os.path.split()
os.rename('test.txt', 'test.py') # 文件重命名
os.remove('test.py') # 删掉文件
shutil.copyfile() # 复制文件
# 列出当前目录下的所有目录
[x for x in os.listdir('.') if os.path.isdir(x)]
# 列出所有的 .py 文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
序列化
序列化含义:把变量从内存中变成可存储或传输的过程
反序列化含义:把变量内容从序列化的对象重新读到内存里
简单来说:就是把变量储存进一个文件中,然后全平台操作系统,都可以无障碍读取这个文件;与编码的区别就是,编码还要注意格式,且储存的是字符(或者是代码本身),而不是这段数据(内存)
PS:序列化在 Python 中叫 pickling,在其他语言中也被称之为 serialization,marshalling,flattening 等等,都是一个意思
import pickle
import json
d = dict(name='Bob', age=20, score=88)
f = open('dump.txt', 'wb')
pickle.dump(d, f) # 把一个对象序列化并写入文件
f.close()
f = open('dump.txt', 'rb')
d = pickle.load(f) # 从文件中反序列化出对象
f.close()
# 针对 JSON(注意数据的变化)
d = dict(name='Bob', age=20, score=88)
print(json.dumps(d)) # 序列化成 JSON
'{"age": 20, "score": 88, "name": "Bob"}'
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str)) # 反序列化成 Python 对象
{'age': 20, 'score': 88, 'name': 'Bob'}
# 针对类
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
s = Student('Bob', 20, 88)
print(json.dumps(s, default=student2dict)) # 序列化成 Python 对象
print(json.dumps(s, default=lambda obj: obj.__dict__)) # 类自带的字典,序列化成 Python 对象
{"age": 20, "name": "Bob", "score": 88}
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student)) # 反序列化成类的实例
<__main__.Student object at 0x10cd3c190>
# PS:写个好玩的,把类的实例序列化成 Python 对象,再序列化成 JSON
print(json.dumps(json.dumps(s, default=student2dict)))
"{\"name\": \"Bob\", \"age\": 20, \"score\": 88}"
喜欢划水摸鱼的废人