INPUT
try:
# 额外参数,如:open('./2.html', 'r', encoding='gbk', errors='ignore')
f = open('./2.html')
# 一次读取全部,文件超过内存大小就不行
print(f.read())
# 根据size读取
while (True):
res = f.read(1024)
if (res):
print(res)
else:
break
# 一次读取一行
line = f.readline()
# 一次读取,按行分配到list
f.readlines()
finally:
if f:
f.close()
with写法,会自动 close
with open('./2.html') as f:
print(f.read())
自定义类使用 with 关键字
class MyOpen(object):
def __enter__(self):
print('进入')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('退出')
def read(self):
print('读取')
with MyOpen() as o:
o.read()
使用上下问管理器
from contextlib import contextmanager
class Test(object):
def run(self):
print('run test')
@contextmanager
def create_test():
print('begin')
t = Test()
yield t
print('end')
with create_test() as t:
t.run()
with也可以使用在函数上
from contextlib import contextmanager
from datetime import datetime
import time
@contextmanager
def test():
beginTime = datetime.now().timestamp()
yield
endTime = datetime.now().timestamp()
print(endTime - beginTime)
# 输出如下代码的执行时间(下面2行代码会在yield的地方执行)
with test():
time.sleep(3)
print('run')
OUTPUT
with open("./1.txt", "w") as f:
f.write('test')
StringIO BytesIO
很多时候,数据读写不一定是文件,也可以在内存中读写
from io import StringIO
from io import BytesIO
f1 = StringIO();
f2 = BytesIO();
os shutil 模块
import os
import shutil
# 操作系统类型
print(os.name)
# 操作系统详细信息
print(os.uname())
# 环境变量
print(os.environ)
# 查看当前目录的绝对路径
print(os.path.abspath('.'))
# 生成目录
print(os.path.join('/Users/tangxiaofeng/wwwroot/python', 'testDir'))
# 拆分目录
print(os.path.split('/Users/tangxiaofeng/wwwroot/python/testDir'))
# 拆分目录,得到扩展名
print(os.path.splitext(('/Users/tangxiaofeng/wwwroot/python/1.csv')))
# 创建目录
os.mkdir(os.path.join('/Users/tangxiaofeng/wwwroot/python', 'testDir'))
# 删除目录
os.rmdir(os.path.join('/Users/tangxiaofeng/wwwroot/python', 'testDir'))
# 重命名文件
print(os.rename('1.txt', '1.py'))
# 删除文件
print(os.remove('1.py'))
# 复制文件
print(shutil.copyfile("1.csv","2.csv"))
序列化
import pickle
d = dict(name='Bob',age=20)
# 序列化
s = pickle.dumps(d)
print(s)
# 反序列化
print(pickle.loads(s))
# 直接序列化写入到文件
f = open('dump.txt','wb')
pickle.dump(d,f)
f.close()
# 从文件中反序列化
f = open("dump.txt",'rb')
d = pickle.load(f)
f.close()
print(d)
JSON序列化
Python的序列化和反序列化只能用于Python,并且可能不同版本的Python彼此都不兼容,所以JSON是更好的选择
import json
# JSON序列化和反序列化
d = dict(name='张三', age=13)
jd = json.dumps(d)
d = json.loads(jd)
print(jd)
print(d)
# 直接序列化写入到文件
f = open('dump.txt', 'w')
json.dump(d, f)
f.close()
f = open('dump.txt', 'r')
print(json.load(f))
对象和JSON互转
import json
class Student(object):
name = ''
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
s = Student('张三', 13)
def studentToDict(obj):
return dict(name=obj.name, age=obj.age)
js = json.dumps(s, default=studentToDict)
print(js)
# 上面方法的偷懒写法
js = json.dumps(s, default=lambda obj: obj.__dict__)
print(js)
def dictToStudent(d):
return Student(d['name'], d['age'])
s = json.loads(js, object_hook=dictToStudent)
print(s.name, s.age)