这里记录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():
--
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():
--
warpper
上面的两种now.__name__改成了warpper,一个完整的例子如下:
import functoolsdef 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('', base=8))
print(int('', base=16))# 这里面我们定义一个二进制的函数
def int2(x, base=2):
return int(x, base)
print(int2('')) ## 采用偏函数的话,可以直接固定一个函数的参数
import functools
int2 = functools.partial(int, base=2)
print(int2('')) #
三、StringIO和BytesIO的使用
from io import StringIOf = StringIO()
f.write('hello')
f.write(' world')
print(f.getvalue()) # hello world# 读取StringIo的数据
f = StringIO('Hello!\nHi!\nGoodbye')
while True:
s = f.readline()
if s == '':
break
print(s.strip())# StringIO只能操作str,如果是二进制的数据,就要用到bytesIO
from io import BytesIOf = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())
运行的结果如下:
hello world
Hello!
Hi!
Goodbye
b'\xe4\xb8\xad\xe6\x96\x87'
四、python中模块os操作目录和文件
# 系统的名称
import os
print(os.name)# 环境变量
print(os.environ)
print(os.environ.get('JAVA_HOME'))# 文件和目录的操作
print(os.path.abspath('.')) # G:\Java\Go\program\2017-05-18\LearnPython1\test10\io
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 pickled = dict(name='huhx', age=20, score=80)
print(pickle.dumps(d)) # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00huhxq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x05\x00\x00\x00scoreq\x04KPu.'# 序列化
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 jsonprint(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'}