这里记录python关于io、装饰器和序列化的一些知识。面对大河我无限惭愧,我年华虚度,空有一身疲倦,和所有以梦为马的诗人一样,岁月易逝 一滴不剩。
python的一些知识
一、python中的装饰器的使用
在调用now函数之前先打印一句话,@log放在函数的定义上面。
def log(func): def wrapper(*args, **kwargs): print('call %s():' % func.__name__) return func(*args, **kwargs) return wrapper @log def now(): print('2017-12-12') now() print(now.__name__)
运行的结果如下:
call now(): 2017-12-12 wrapper
如果是需要在装饰器中传递参数,需要在外面多嵌套一层。
def log(text): def decorator(func): def warpper(*args, **kwargs): print('%s %s():' % (text, func.__name__)) return func(*args, **kwargs) return warpper return decorator @log('hello world') def now(): print('2017-12-12') now() print(now.__name__)
运行的结果如下:
hello world now(): 2017-12-12 warpper
上面的两种now.__name__改成了warpper,一个完整的例子如下:
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
import functools是导入functools模块。模块的概念稍候讲解。现在,只需记住在定义wrapper()的前面加上@functools.wraps(func)即可。
二、python中偏函数的使用
# 偏函数的使用 print(int('12345', base=8)) print(int('12345', base=16)) # 这里面我们定义一个二进制的函数 def int2(x, base=2): return int(x, base) print(int2('100101010')) # 298 # 采用偏函数的话,可以直接固定一个函数的参数 import functools int2 = functools.partial(int, base=2) print(int2('101001010')) # 330
三、StringIO和BytesIO的使用
from io import StringIO f = StringIO() f.write('hello') f.write(' world') print(f.getvalue()) # hello world # 读取StringIo的数据 f = StringIO('Hello! Hi! Goodbye') while True: s = f.readline() if s == '': break print(s.strip()) # StringIO只能操作str,如果是二进制的数据,就要用到bytesIO from io import BytesIO f = BytesIO() f.write('中文'.encode('utf-8')) print(f.getvalue())
运行的结果如下:
hello world Hello! Hi! Goodbye b'xe4xb8xadxe6x96x87'
四、python中模块os操作目录和文件
# 系统的名称 import os print(os.name) # 环境变量 print(os.environ) print(os.environ.get('JAVA_HOME')) # 文件和目录的操作 print(os.path.abspath('.')) # G:JavaGoprogram2017-05-18LearnPython1 est10io print(os.path.join('C:/Users/michael', 'testdir')) os.mkdir(os.path.join('C:/Users/michael', '/testdir')) # 得到文件的目录和文件名称 directory, filename = os.path.split('/Users/michael/testdir/file.txt') print(directory) print(filename) # 得到文件的后缀 print(os.path.splitext('/path/to/file.txt')[1]) # .txt # 修改文件名和删除文件 os.rename('test.txt', 'test.py') os.remove('test.py') # 文件的复制 import shutil shutil.copyfile('/user/huhx.txt', '/user/linux.txt')
五、python中的序列化
import pickle d = dict(name='huhx', age=20, score=80) print(pickle.dumps(d)) # b'x80x03}qx00(Xx04x00x00x00nameqx01Xx04x00x00x00huhxqx02Xx03x00x00x00ageqx03Kx14Xx05x00x00x00scoreqx04KPu.' # 序列化 f = open('dump.txt', 'wb') pickle.dump(d, f) f.close() # 反序列化 f = open('dump.txt', 'rb') d = pickle.load(f) f.close() print(d) # {'name': 'huhx', 'age': 20, 'score': 80} import json print(json.dumps(d)) # {"name": "huhx", "age": 20, "score": 80} json_str = '{"age": 20, "score": 88, "name": "Bob"}' print(json.loads(json_str)) # {'age': 20, 'score': 88, 'name': 'Bob'}