Python3学习笔记_C(模块、文件)


笔记中代码均可运行在Jupyter NoteBook下(实际上Jupyter-lab使用体验也很棒)。

建议不要光看,要多动手敲代码。眼过千遭,不如手读一遍。

相关笔记的jupiter运行代码已经上传,请在资源中自行下载。

模块

'''
os.__file__

__file__:用于显示当前文件所在的绝对路径

import os

xxx-cpython-35.pyc 表示c语言编写的Python编译器3.5版本的字节码

import Name

from name import defName,defName2

from name import * 注意:这里尽量不要使用这种方法导入;

使用这种方式导入,若存在同名函数,后导入的函数会覆盖先导入的函数

import Name as sName

__name__属性

在模块被调用时不希望调用模块中的某些功能可是使用"__name__"属性来实现

例子:
if __name__ == '__main__':
    print('在本体模块内被调用')
else:
    print('在其他模块内被调用')
例子结束

__all__属性

在模块被导入时的所有方法名
所有在模块被调用的方法名都存在__all__[]中

__all__属性的功能还可用dir([x])来实现

dir()函数会罗列当前定义的所有名称

并不是所有模块都有"__all__"属性

程序执行时导入模块路径:
import sys

sys.path.append('/home/itcast/xxx')
# 末尾追加路径
sys.path.insert(0, '/home/itcast/xxx') 
#头部添加路径(可以确保先搜索这个路径)
'''
# 程序执行时添加路径 例子
import sys

raw_list = sys.path

sys.path.append('D:\\Documents\\Jupyter_notebook')

append_list = sys.path

sys.path.insert(0, 'D:\\Documents')

insert_list = sys.path

print('raw_list = {}\n\nappend_list = {}\n\ninsert_list = {}'.format(
    raw_list,append_list,insert_list
))
raw_list = ['D:\\Documents', '', 'D:\\Documents\\Jupyter_notebook', 'C:\\MyPrograms\\Anaconda3\\python37.zip', 'C:\\MyPrograms\\Anaconda3\\DLLs', 'C:\\MyPrograms\\Anaconda3\\lib', 'C:\\MyPrograms\\Anaconda3', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\win32', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\shj\\.ipython', 'D:\\Documents\\Jupyter_notebook']

append_list = ['D:\\Documents', '', 'D:\\Documents\\Jupyter_notebook', 'C:\\MyPrograms\\Anaconda3\\python37.zip', 'C:\\MyPrograms\\Anaconda3\\DLLs', 'C:\\MyPrograms\\Anaconda3\\lib', 'C:\\MyPrograms\\Anaconda3', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\win32', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\shj\\.ipython', 'D:\\Documents\\Jupyter_notebook']

insert_list = ['D:\\Documents', '', 'D:\\Documents\\Jupyter_notebook', 'C:\\MyPrograms\\Anaconda3\\python37.zip', 'C:\\MyPrograms\\Anaconda3\\DLLs', 'C:\\MyPrograms\\Anaconda3\\lib', 'C:\\MyPrograms\\Anaconda3', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\win32', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\MyPrograms\\Anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\shj\\.ipython', 'D:\\Documents\\Jupyter_notebook']
# __all__和dir() 比较例子
print('this is a example for __all_ and dir()')
import os
A=os.__all__
B=dir(os)
print('this is __all__:',A)
print('\n***\n'*2)
print('this is dir(): ',A)
print('\n***\n'*2)
C=list(set(A).difference(set(B)))
print('this is difference of __all__ and dir()', C)

this is a example for __all_ and dir()
this is __all__: ['altsep', 'curdir', 'pardir', 'sep', 'pathsep', 'linesep', 'defpath', 'name', 'path', 'devnull', 'SEEK_SET', 'SEEK_CUR', 'SEEK_END', 'fsencode', 'fsdecode', 'get_exec_path', 'fdopen', 'popen', 'extsep', '_exit', 'DirEntry', 'F_OK', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'R_OK', 'TMP_MAX', 'W_OK', 'X_OK', 'abort', 'access', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'device_encoding', 'dup', 'dup2', 'environ', 'error', 'execv', 'execve', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'link', 'listdir', 'lseek', 'lstat', 'mkdir', 'open', 'pipe', 'putenv', 'read', 'readlink', 'remove', 'rename', 'replace', 'rmdir', 'scandir', 'set_handle_inheritable', 'set_inheritable', 'spawnv', 'spawnve', 'startfile', 'stat', 'stat_result', 'statvfs_result', 'strerror', 'symlink', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'write', 'makedirs', 'removedirs', 'renames', 'walk', 'execl', 'execle', 'execlp', 'execlpe', 'execvp', 'execvpe', 'getenv', 'supports_bytes_environ', 'spawnl', 'spawnle']

***

***

this is dir():  ['altsep', 'curdir', 'pardir', 'sep', 'pathsep', 'linesep', 'defpath', 'name', 'path', 'devnull', 'SEEK_SET', 'SEEK_CUR', 'SEEK_END', 'fsencode', 'fsdecode', 'get_exec_path', 'fdopen', 'popen', 'extsep', '_exit', 'DirEntry', 'F_OK', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'R_OK', 'TMP_MAX', 'W_OK', 'X_OK', 'abort', 'access', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'device_encoding', 'dup', 'dup2', 'environ', 'error', 'execv', 'execve', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'link', 'listdir', 'lseek', 'lstat', 'mkdir', 'open', 'pipe', 'putenv', 'read', 'readlink', 'remove', 'rename', 'replace', 'rmdir', 'scandir', 'set_handle_inheritable', 'set_inheritable', 'spawnv', 'spawnve', 'startfile', 'stat', 'stat_result', 'statvfs_result', 'strerror', 'symlink', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'write', 'makedirs', 'removedirs', 'renames', 'walk', 'execl', 'execle', 'execlp', 'execlpe', 'execvp', 'execvpe', 'getenv', 'supports_bytes_environ', 'spawnl', 'spawnle']

***

***

this is difference of __all__ and dir() []
#dir() 例子

dir()
['In',
 'Out',
 '_',
 '__',
 '___',
 '__builtin__',
 '__builtins__',
 '__doc__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_dh',
 '_i',
 '_i1',
 '_i10',
 '_i11',
 '_i12',
 '_i13',
 '_i14',
 '_i15',
 '_i16',
 '_i17',
 '_i18',
 '_i19',
 '_i2',
 '_i20',
 '_i3',
 '_i4',
 '_i5',
 '_i6',
 '_i7',
 
 '_i8',
 '_i9',
 '_ih',
 '_ii',
 '_iii',
 '_oh',
 'a',
 'add',
 'alist',
 'astring',
 'exit',
 'get_ipython',
 'i',
 'is_odd',
 'l',
 'newlist',
 'numlist',
 'produce',
 'quit',
 'reduce',
 'sort_list',
 'sorted_str',
 'sum']

os模块

'''
os.access(path,mode) 

检查权限;path:路径;mode{
os.F_OK: 作为access()的mode参数,测试path是否存在。最常用
os.R_OK: 包含在access()的mode参数中 , 测试path是否可读。
os.W_OK 包含在access()的mode参数中 , 测试path是否可写。
os.X_OK 包含在access()的mode参数中 ,测试path是否可执行。
}

os.chdir(path) 改变当前工作目录

os.chmod(path,mode) 更改权限

os.chown(path, uid, gid) 更改文件所有者

os.chroot(path) 改变当前进程的根目录

os.path.realpath(__file__) 返回真实路径

os.path.split() 返回路径的目录和文件名

os.getcwd() 得到当前工作的目录

__file__ 是用来获得模块所在的路径的 

更多参照下方的help

'''
import os
dir(os)
['DirEntry',
 'F_OK',
 'MutableMapping',
 'O_APPEND',
 'O_BINARY',
 'O_CREAT',
 'O_EXCL',
 'O_NOINHERIT',
 'O_RANDOM',
 'O_RDONLY',
 'O_RDWR',
 'O_SEQUENTIAL',
 'O_SHORT_LIVED',
 'O_TEMPORARY',
 'O_TEXT',
 'O_TRUNC',
 'O_WRONLY',
 'P_DETACH',
 'P_NOWAIT',
 'P_NOWAITO',
 'P_OVERLAY',
 'P_WAIT',
 'PathLike',
 'R_OK',
 'SEEK_CUR',
 'SEEK_END',
 'SEEK_SET',
 'TMP_MAX',
 'W_OK',
 'X_OK',
 '_Environ',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_execvpe',
 '_exists',
 '_exit',
 '_fspath',
 '_get_exports_list',
 '_putenv',
 '_unsetenv',
 '_wrap_close',
 'abc',
 'abort',
 'access',
 'altsep',
 'chdir',
 'chmod',
 'close',
 'closerange',
 'cpu_count',
 'curdir',
 'defpath',
 'device_encoding',
 'devnull',
 'dup',
 'dup2',
 'environ',
 'error',
 'execl',
 'execle',
 'execlp',
 'execlpe',
 'execv',
 'execve',
 'execvp',
 'execvpe',
 'extsep',
 'fdopen',
 'fsdecode',
 'fsencode',
 'fspath',
 'fstat',
 'fsync',
 'ftruncate',
 'get_exec_path',
 'get_handle_inheritable',
 'get_inheritable',
 'get_terminal_size',
 'getcwd',
 'getcwdb',
 'getenv',
 'getlogin',
 'getpid',
 'getppid',
 'isatty',
 'kill',
 'linesep',
 'link',
 'listdir',
 'lseek',
 'lstat',
 'makedirs',
 'mkdir',
 'name',
 'open',
 'pardir',
 'path',
 'pathsep',
 'pipe',
 'popen',
 'putenv',
 'read',
 'readlink',
 'remove',
 'removedirs',
 'rename',
 'renames',
 'replace',
 'rmdir',
 'scandir',
 'sep',
 'set_handle_inheritable',
 'set_inheritable',
 'spawnl',
 'spawnle',
 'spawnv',
 'spawnve',
 'st',
 'startfile',
 'stat',
 'stat_result',
 'statvfs_result',
 'strerror',
 'supports_bytes_environ',
 'supports_dir_fd',
 'supports_effective_ids',
 'supports_fd',
 'supports_follow_symlinks',
 'symlink',
 'sys',
 'system',
 'terminal_size',
 'times',
 'times_result',
 'truncate',
 'umask',
 'uname_result',
 'unlink',
 'urandom',
 'utime',
 'waitpid',
 'walk',
 'write']

hashlib模块

用于生成hash(哈希)码等操作
参考于python高级

hashlib.new(name[, data])
对数据进行加密

参数:name:加密算法名,例如:‘md5’,[, data]要加密的数据

hash.digest() 返回二进制数据字符串的摘要
hash.hexdigest() 返回16进制数据字符串的摘要
hash.digest_size hash对象的字节长度
hash.block_size hash对象的内部块大小
hash.name hash对象的名称
hash.update(data) 传递类字节参数(通常是bytes)更新hash对象。
重复调用update()等同于单次的拼接调用:m.update(a); m.update(b)等同m.update(a+b)
hash.copy() 返回hash对象的克隆

这里hash指的是经过加密算法加密后的摘要

hashlib.algorithms_guaranteed 所有平台的hashlib模块都支持的hash算法的名称集合。
hashlib.algorithms_available 当前运行的python解释器支持的hash算法的名称集合

hashlib.algorithms_guaranteed的结果集总是hashlib.algorithms_available结果集的子集

简单的加密算法可能通过“撞库”破解,这时可以通过附加key来加强安全性

首先设定key,这个key最好是动态的,并且不能泄露,不然安全性会降低
然后设定加密算法md5 = hashlib.md5(key)这里的key指的是自定义的key值
再通过res = md5.update(data)来对data数据进行加密
最后通过res.hexdigest()输出密文

# hashlib.new()使用例子
import hashlib

tmp = "PHP是世界上最好的语言".encode("utf-8")
result = hashlib.new('sha1', tmp)
print("二进制摘要:",result.digest())
print("16进制摘要:",result.hexdigest())
print("result摘要的字节长度:",result.digest_size)
print("result摘要的内部块大小:", result.block_size)
print("result对象的内部名(也可看做加密算法名):",result.name)
二进制摘要: b'\xc1W:\xb5VF=\xed\xb7\x8f\xfa\x1c\xe5\xe2\x11\x93\xc4ND8'
16进制摘要: c1573ab556463dedb78ffa1ce5e21193c44e4438
result摘要的字节长度: 20
result摘要的内部块大小: 64
result对象的内部名: sha1
# 高级加密(附加key)

key = "您说的对".encode("utf-8")
print(key)
sha1 = hashlib.sha1(key)
pa = sha1.update(tmp)
pb = sha1.hexdigest()
print("未添加key加密后的密文:",result.hexdigest())
print("高级加密后的密文:", pb)
b'\xe6\x82\xa8\xe8\xaf\xb4\xe7\x9a\x84\xe5\xaf\xb9'
未添加key加密后的密文: c1573ab556463dedb78ffa1ce5e21193c44e4438
高级加密后的密文: af672023437b22c31233917c74b489c9c2ede424
# hash.update()例子
# 分段加密的最终密文和不分段单次加密后的密文是相同的
sha1 = hashlib.sha1() # 选定算法
sha1.update(tmp) # 加密第一段
pa_res = sha1.hexdigest()
print("分段加密第一段密文:", pa_res)
sha1.update(key) # 加密第二段
pb_res = sha1.hexdigest()
print("分段加密第二段密文:", pb_res)
sha1 = hashlib.sha1() # 复位算法,尤其重要,否则后面的总段会认为是第三分段,而不是总段
sha1.update(tmp+key) # 加密总段
pc_res = sha1.hexdigest()
print("不分段加密后的密文:", pc_res)
print("第一分段字节编码:", tmp,'\n',"第二分段字节编码",key,'\n',"总段字节编码:",tmp+key) # 打印第一段,第二段,总段的字节编码

分段加密第一段密文: c1573ab556463dedb78ffa1ce5e21193c44e4438
分段加密第二段密文: 5e9d37c4e41b5abdf8fe3f52b22c435622682c60
不分段加密后的密文: 5e9d37c4e41b5abdf8fe3f52b22c435622682c60
第一分段字节编码: b'PHP\xe6\x98\xaf\xe4\xb8\x96\xe7\x95\x8c\xe4\xb8\x8a\xe6\x9c\x80\xe5\xa5\xbd\xe7\x9a\x84\xe8\xaf\xad\xe8\xa8\x80' 
 第二分段字节编码 b'\xe6\x82\xa8\xe8\xaf\xb4\xe7\x9a\x84\xe5\xaf\xb9' 
 总段字节编码: b'PHP\xe6\x98\xaf\xe4\xb8\x96\xe7\x95\x8c\xe4\xb8\x8a\xe6\x9c\x80\xe5\xa5\xbd\xe7\x9a\x84\xe8\xaf\xad\xe8\xa8\x80\xe6\x82\xa8\xe8\xaf\xb4\xe7\x9a\x84\xe5\xaf\xb9'

常用标准库

官方网址:
https://docs.python.org/3.7/library/

builtins 内建函数默认加载

os 操作系统接口

sys python自身的运行环境

functools 常用的工具

json 编码和解码JSON对象

logging 记录日志,调试

multiprocessing 多进程

threading 多线程

copy 拷贝

time 时间 

time 模块参考网址:https://finthon.com/python-time/

datetime 日期和时间

calendar 日历

hashlib 哈希加密算法

random 随机数

re 正则

socket 标准BSD Sockets API

shutil 文件和目录管理(和os模块互补)

glob 基于文件通配符搜索
'''
深拷贝、浅拷贝

这里的深浅指的是拷贝的程度

浅拷贝:只是对同一个变量的地址引用(地址的拷贝),这里的拷贝只是用引用指向

深拷贝:这里需要导入模块【import copy ;new = copy.deepcopy(old)】这里的拷贝是新建了内存的拷贝

copy模块中的copy和deepcopy的区别:copy只copy第一层,而deepcopy是完全copy

copy拷贝的特点:自动判断>>>当copy的对象是不可变类型时,浅拷贝,当是可变类型时,copy第一层
'''
functools模块
'''
这个模块中放置相对常用的一些方法

partial()(偏函数):把一个函数的某些参数设置成默认值,返回一个新的函数,
调用这个新的函数更简单
'''

# 例子

import functools

def test(*args, **kwargs):
    #注意这里的可变长参数,如果设置定长参数,会出现参数多给报错
    print('the args in test is:',args)
    print('the kwargs in test is: ', kwargs)

q = functools.partial(test, 1,2)
q()
q(666, 2333)
the args in test is: (1, 2)
the kwargs in test is:  {}
the args in test is: (1, 2, 666, 2333)
the kwargs in test is:  {}

常用扩展库

'''
requests 使用urllib3,继承了urllib2的所有特性

urllib 基于http的高层库

scrapy 爬虫

beautifulsoup4 HTML/XML的解析器

celery 分布式任务调度模块

redis 缓存

Pillow(PIL) 图像处理

xlsxwriter 仅写excle功能,支持xlsx

xlwt 仅写excel功能,支持xls,2013或更早版office

xlrd 只读excle功能

elasticsearch 全文搜索引擎

pymysql MySQL链接库

mongoengine/pymongo mongodbpython接口

matplotlib 画图

numpy/scipy 科学计算

django/tornado/flask web框架

SimpleHTTPServer 简单HTTPServer,不使用Web框架

gevent 基于协程的Python网络库

fabric 系统管理

pandas 数据处理库

scikit-learn 机器学习库
'''

包和__init__

'''
在一个文件夹下有py文件,有__init__.py文件称为包

包中__init__.py文件的内容应含有__all__,以及
from . import xxxName : 这里是对from * (all)以及 import 的导包方法的使用声明

如果__init__文件为空,导包会失败

模块重新导入

向导入模块中添加新的路径:sys.path.append("yourPath")

重新导入模块

from ModelName import *

reload("old_Model") # 这里的参数是要重新导入的模块

模块的循环导入问题

a模块中导入了b模块,然而在b模块中又导入了a模块(这样就出现了一个模块导入的死递归)

解决方法:再建立一个新的模块,让这两个递归的模块成为子模块,让那个新的模块调用这两个模块
'''

输入输出

'''
给程序传参:sys

import sys

print(sys.argv) #这里sys.argv是一个列表,0表示程序名,1:表示传入的参数
'''
# sys.argv 例子
import sys
print(sys.argv)
['/home/shj/WorkStations/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py', '-f', '/run/user/1000/jupyter/kernel-fc9aa604-d8c9-4367-a568-145f624bfffd.json']

输入

'''
input() 键入字符串
'''

输出

'''
repr(): 产生一个解释器易读的表达形式。

print() 打印
'''
# repr() 例子
s = '123456'
repr(s)
"'123456'"
'''
格式化输出
print('xxx %d' %(123))
print('strings{key}'.format())# {}中可以设置变量名,在format中用key=value赋值,{}中设置数字顺序在format中可以按序号给出值
'''
#format()例子
print("this is sequence:{} {} {}".format('who','am', 'i'))
print('*'*8)
print("this is no sequence:{2} {1} {0}".format('who','am', 'i'))
this is sequence:who am i
********
this is no sequence:i am who

文件

'''

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)

参数说明:
{
    file: 必需,文件路径(相对或者绝对路径)
    mode: 可选,文件打开模式
    buffering: 设置缓冲区大小,默认-1:全缓冲,0:无缓冲,1:行缓冲,大于1的任意整数:任意字节大小的缓冲区
    encoding: 一般使用utf8
    errors: 报错级别
    newline: 区分换行符
    closefd: 传入的file参数类型
}

file.close() 关闭

file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件

file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 
可以用在如os模块的read方法等一些底层操作上。

file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。

file.next() 返回文件下一行。(python3中不支持此方法)

file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。

file.write(str)

file.readline([size]) 读取整行,包括 "\n" 字符。 size表示读取的行内字节数,
当size大小超过整行数据大小时,读取整行

file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,
返回总和大约为sizeint字节大小的所在行, 
实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

file.seek(size,pos(0开头,1中间,2结尾)) size表示偏移量(单位为字节),
pos表示偏移位置(0开头,1中间,2结尾)

file.tell() 返回地址

file.writelines(sequence) 向文件写入一个序列字符串列表,
如果需要换行则要自己加入每行的换行符。

file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;
截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

OS

import os

os.rename("old","new") #重命名

os.mkdir("name") #创建dir

os.getcwd() #获取当前路径

os.chdir("newpath") #改变默认目录

os. listdir("./") #获取目录
'''
# 文件例子
import os

print(os.listdir('./Gnerate_files/'))
with open('./Gnerate_files/fileDemo.txt','w',encoding='utf-8') as f_out:
    f_out.write('this is a file wirte demo.')
    print("file writed!")
    
print(os.listdir('./Gnerate_files/'))
with open('./Gnerate_files/fileDemo.txt','r',encoding='utf-8') as f_in:
    print("file read in:")
    print(f_in.read())
    
['.ipynb_checkpoints', 'data.pkl', 'func2.log', 'out.log', '闭包用途2使用文档.txt']
file writed!
['.ipynb_checkpoints', 'data.pkl', 'fileDemo.txt', 'func2.log', 'out.log', '闭包用途2使用文档.txt']
file read in:
this is a file wirte demo.

pickle模块

'''
pickle 模块
python的pickle模块实现了基本的数据序列和反序列化。

序列化操作:将程序中运行的对象信息保存到文件中去,永久存储。

反序列化操作:可从文件中创建上一次程序保存的对象。

基本接口:

pickle.dump(obj, file, [,protocol]) 将数据序列化(二进制)输出到文件
protocol为可选参数,默认为0,当为-1时为最高级协议版本

x = pickle.load(file) 将file文件保存的数据反序列化(还原)

str = pickle.dumps(data) 将data数据序列化为一串字符串
data_re = pickle.loads(str) 将序列化字符串str反序列化
'''
# 序列化
import pickle

# 使用pickle模块将数据对象保存到文件
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('./Gnerate_files/data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()
#反序列化
import pprint, pickle, os

#使用pickle模块从文件中重构python对象
pkl_file = open('./Gnerate_files/data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()

os.listdir('./Gnerate_files/')
{'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None}
[1, 2, 3, <Recursion on list with id=139781466126792>]





['.ipynb_checkpoints',
 'data.pkl',
 'fileDemo.txt',
 'func2.log',
 'out.log',
 '闭包用途2使用文档.txt']
发布了13 篇原创文章 · 获赞 0 · 访问量 27

猜你喜欢

转载自blog.csdn.net/qq_34764582/article/details/104940227
今日推荐