Python第六周 学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python第六周 学习笔记相关的知识,希望对你有一定的参考价值。
文件操作
打开操作
- io.open(file, mode=‘r‘, buffering=-1, encoding=None,errors=None, newline=None, closefd=True, opener=None)
-
返回一个文件对象(流对象)和文件描述符。打开文件失败,则返回异常
- 基本使用:
f = open("test") print(f.read()) f.close()
-
使用完一定要关闭
- 文件访问模式分两种:
文本模式和二进制模式
open的参数
file
- 打开或者要创建的文件名。如果不指定路径,默认是当前路径
mode模式
参数 | 描述 |
---|---|
r | 缺省的,表示只读打开,如果调用write,会抛异常。如果文件不存在,抛出FileNotFoundError异常 |
w | 只写打开,如果文件不存在,则直接创建文件,如果文件存在,则清空文件内容 |
x | 创建并写入一个新文件,如果文件存在,抛出FileExistsError异常 |
a | 写入打开,如果文件存在,则追加 |
b | 二进制模式,与字符编码无关,字节操作使用bytes类型 |
t | 缺省的,文本模式,将文件的字节按照某种字符编码理解,按照字符操作 |
+ | 读写打开一个文件。给原来只读、只写方式打开提供缺失的读或者写能力,不能单独使用。获取文件对象依旧按照r、w、a、x的特征 |
r只读,wxa只写
wxa都可以产生新文件
文件指针
- 指向当前字节位置
- mode=r 指针起始为0
- mode=a 指针起始在EOF
tell()
- 显示指针当前位置
seek(offset[, whence])
- 移动指针位置,offset 移动字节数,
- whence 文本模式与二进制模式下操作的表现形式可能有不同
-
文本模式下
- whence 0 缺省值,表示从头开始,offset只能正整数
- whence 1 表示从当前位置,offset只接受0
- whence 3 表示从EOF开始,offset只接受0
- 二进制模式下
- whence 0 缺省值,表示从头开始,offset只能正整数
- whence 1 表示从当前位置,offset可正可负
- whence 2 表示从EOF开始,offset可正可负
二进制模式支持任意起点的偏移,从头、从尾、从中间位置开始。
向后seek可以超界,但是向前seek的时候,不能超界,否则抛异常
buffering:缓冲区
- -1表示缺省buffer大小
- 二进制模式: 使用io.DEFAULT_BUFFER_SIZE值控制
- 文本模式: 如果是终端设备,使用行缓存,否则与二进制模式相同
- 0 只在二进制模式使用,表示关buffer
- 1 只在文本模式使用,表示行缓冲 (见到换行符就flush)
- 大于1 指定buffer大小
buffer缓冲区
- 一个内存空间,FIFO队列,缓冲区满或者达到阈值,就会flush到磁盘
-
flush()
- 将缓冲区数据写入磁盘
- 调用close()时会先调用flush()
-
encoding:
- 仅文本模式使用
- 默认值None使用默认编码(windows GBK,Linux UTF8)
-
errors
- None和strict 有错误将抛异常,ignore 忽略
-
newline
- 默认None ‘\n‘, ‘\r‘, ‘\r\n‘皆视为换行(都被转换为/n)
- “表示不会自动转换通用换行符
- 其他合法字符表示指定字符为换行符
- closefd
- 关闭文件描述符,True 关闭,False 文件关闭后保持描述符
read
- read(size=-1)
- size 读取多少个字符或字节 负数或None 读取到EOF
行读取
-
readline(size=-1)
- 每次读取一行,size 控制每次读取一行的几个字符或字节
- readlines(hint=-1)
- 读取所有行的列表
write
- write(s) 返回写入字符个数
- writelines(lines) 写入字符串列表
其他
- seekable()
- readable()
- writable()
- closed
上下文管理
-
由解释器释放对象
- 语法:with ... as
- 上下文管理的语句块不会开启新的作用域
- 语句块执行完自动关闭文件对象
内存IO
StringIO
from io import StringIO
- 内存中开辟一个文本模式的buffer,可以像文件对象一样操作
-
当调用close后,buffer会被释放
- 方法与文件IO类似
-
getvalue()
- 获取全部内容
- 优点
- 减少数据落地,提高运行效率
BytesIO
from io import BytesIO
- 与StringIO类似
file-like对象
- 类文件对象:
- socket、stdin、stdout都是类文件对象
路径操作
- 建议使用pathlib模块,使用Path对象来操作
from pathlib import Path
路径拼接与分解
操作符 /
- 操作符重载
- Path对象 / Path对象
- Path对象 / 字符串 或 字符串 / Path对象
parts
- 将路径分解,返回一个元组
from pathlib import Path p3 = Path.cwd() p3.parts
output: (‘/‘, ‘data‘, ‘MyPythonObject‘)
joinpath
- 连接多个字符到Path对象中
获取路径
- str 获取路径字符串
- bytes 获取路径字节
父目录
- parent 返回父目录Path类对象
- parents 返回父目录可迭代对象,索引0是当前直接的父目录
其他
- name 目录的最后一个部分
- suffix 目录中最后一个部分的扩展名
- stem 目录最后一个部分,没有后缀
- suffixes 返回多个扩展名列表
- with_suffix(suffix) 补充扩展名到路径尾部,返回新的路径,扩展名存在则无效
-
with_name(name) 替换目录最后一个部分并返回一个新的路径
- cwd() 返回当前工作目录
-
home() 返回当前家目录
- is_dir() 是否目录
- is_file() 是否普通文件
- is_symlink() 是否软链接
- is_socket() 是否socket文件
- is_block_device() 是否块设备
- is_char_device() 是否字符设备
-
is_absolute() 是否绝对路径
- resolve() 返回当前Path对象的绝对路径,如果是软链接则直接被解析
-
absolute() 返回绝对路径,建议使用resolve
- exists() 目录或文件是否存在
- rmdir() 删除空目录。没有提供判断目录为空的方法
- touch(mode=0o666,exist_ok=True) 创建一个文件
-
as_uri() 将路径返回成URI,例如"file:///etc/passwd"
-
mkdir(mode=0o777,parents=False,exist_ok=False)
- parents 是否创建父目录,True等同于mkdir -p False时,父目录不存在,则抛FileNotFoundError
- exist_ok False时,路径存在,抛出FileExistsError True时,忽略此异常
-
iterdir() 迭代当前目录
-
glob() 通配给定的模式
-
rglob() 通配给定的模式,递归目录 返回一个生成器
-
match() 模式匹配,成功返回True
-
stat() 查看文件属性
- lstat() 同stat 但如果时链接文件,则显示本身的文件信息
文件操作
-
open(mdoe=‘r‘,buffering=-1,encoding=None,errors=None,newline=None)
- 类似内建函数open 返回一个文件对象
-
read_bytes()
- 以‘rb’读取
-
read_text(encoding=None,errors=None)
- 以“rt‘读取
-
Path.write_bytes(data)
- 以wb写入
- write_text(data,encoding=None,errors=None)
- 以‘wt‘写入
os模块
-
os.name
- windows是nt,Linux是posix
-
os.uname()
- 返回系统信息 仅linux
-
sys.platform
- windos显示win32 linux显示linux
-
os.listdir(‘0:/temp‘)
- 返回目录内容列表
-
os.stat(path, *, dir_fd=None, follow_symlinks=True)
- 本质上调用Linux的stat
- path:路径的string或bytes,或fd文件描述符
- follow_symlinks True返回文件本身信息,False 如果时软链连接则显示软链接本身
-
os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)
- 参考Linux chmod命令
- os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)
- 参考Linux chown命令
shutil模块
-
copyfileobj(fsrc, fdst[, length])
- 复制内容
-
copyfile(src, dst, *, follow_symlinks=True)
- 复制内容
-
copymode(src, dst, *, follow_symlinks=True)
- 复制权限
-
copystat(src, dst, *, follow_symlinks=True)
- 复制元数据,包括权限
-
copy(src, dst, *, follow_symlinks=True)
- 复制内容、权限
-
copy2(src, dst, *, follow_symlinks=True)
- 复制内容、元数据
-
copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
- 递归复制目录 默认使用copy2
-
rmtree(path, ignore_errors=False, onerror=None)
- 递归删除 慎用
- move(src, dst, copy_function=copy2)
- 递归移动文件、目录
csv文件
- Comma-Separated Values
- 被行分隔符、列分隔符划分成行与列
-
csv不指定字符编码
- 行分隔符为\r\n
- 列分隔符常为逗号或制表符
如果字段中含有双引号、逗号、换行符,必须使用双引号括起来。
如果字段本身包含双引号,使用两个双引号表示一个转义
csv模块
-
reader(csvfile, dialect=‘excel‘, **fmtparams)
- 返回DictReader对象,是一个行迭代器
-
fmtparams可设置
- delimiter 列分隔符,默认逗号
- lineterninator 行分隔符 默认/r/n
-
quotechar 字段引用符号,默认双引号
- doublequote 双引号处理 默认True ,quochar显示两个,False 使用eacapechar作为quotechar的前缀
- escapechar 转义字符,默认None
- quoting 指定双引号规则。QUOTE_ALL所有字段 QUOTE_MINIMAL特殊字符字段 QUOTE_NONNUMNERIC非数字字段 QUOTE_NONE 不适用引号
- writer(csvfile, dialect=‘excel‘, **fmtparams)
- 返回DictWriter实例
- DictWriter的主要方法有writerow、writerows
ini文件
- ini文件格式形如:
[DEFAULT]
a = test
[mysql]
default-character-set=utf8
a = 1000
[mysqld]
datadir =/dbserver/data
port = 33060
character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- 中括号的内容称为section
- 每个section中,都是key,value形式的键值对,key称为option
缺省section DEFAULT必须大写
configparser模块
ConfigParserle类
from configparser import ConfigParser
cfg = ConfigParser()
-
可将section当作key,其对应的值是存储着option的键值对字典,即ini文件是一个嵌套字典。默认使用有序字典
-
read(filenames, encoding=None)
- 读取文件,filenames可单独文件或文件列表
-
sections()
- 返回section列表。不包括缺省section
-
add_section(section_name)
- 增加section
-
has_section(section_name)
- 是否存在一个section
-
options(section)
- 返回一个section的options,包括缺省section的options
-
has_option(section)
- 是否存在一个section的option
-
get(section, option, *, raw=False, vars=None[, fallback])
- 从指定的section的option取值,如未找到,去DEFAULT找
- getint(section, option, *, raw=False, vars=None[, fallback])
- getfloat(section, option, *, raw=False, vars=None[, fallback])
-
getboolean(section, option, *, raw=False, vars=None[, fallback])
- 返回指定类型数据
-
items(raw=False, vars=None)
- 返回所有section名与其对象
-
items(section, raw=False, vars=None)
- 返回指定section的option的键值对二元组
-
set(section, option, value)
- 设置指定section的option=value(option,value必须为字符串 ),section不存在则抛异常
-
remove_section(section)
- 移除section及其option
-
remove_option(section, option)
- 移除指定section下的指定option
- write(fileobject, space_around_delimiters=True)
- 将当前config的所有内容写入fileobject中
序列化与反序列化
定义
-
serialization 序列化
- 将内存中对象存储下来,把它变成一个个字节 -> 二进制
-
deserialization 反序列化
- 将文件的一个个字节恢复成内存中对象 <- 二进制
- 序列化保存到文件就是持久化
- 一般将数据序列化后持久化或进行网络传输或是从文件、接受自网络的字节序列反序列化
pickle库
-
dump(obj, protocol=None, *, fix_imports=True)
- 将对象序列化为bytes对象
-
dump(obj, file, protocol=None, *, fix_imports=True)
- 将对象序列化到文件对象,即存入文件
-
loads(file, *, fix_imports=True, encoding="ASCII", errors="strict")
- 从bytes对象反序列化
- load(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")
- 从文件读取数据反序列化
序列化、反序列化实验
序列化应用
- 一般使用在网络传输中,将数据序列化后通过网络传输到远程节点,远程服务器上的服务将接收到的数据反序列化使用
- 注意:远程接收端反序列化时必须有对应的数据类型,否则会报错。尤其自定义类,必须远程端有一致的定义
- 大多数项目都不是单机、单服务的。需要通过网路将数据传送到其他节点,因此需要大量的序列化与反序列化
- 但是如果跨平台、跨语言、跨协议之间通常使用XML、Json、Protocol Buffer等。不选择pickle
Json模块
-
JavaScript Object Notation
- Json数据类型
-
值
-
字符串
-
数值
-
对象
- 无序键值对集合
- key必须是字符串,用双引号包围
- value可任意合法值
- 数组
- 有序的值的集合
- 有序的值的集合
常用方法
import json
-
dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- json编码
-
dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- json编码并存入文件
-
loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- json解码
- load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- json解码,从文件读取数据
MessagePack模块
- 与json类似,但同样数据所占空间要小于Json
安装
- $ pip install msgpack-python
常用方法
import msgpack
-
packb(o, **kwargs) <=> dumps
- 序列化对象。提供了dumps来兼容pickle和json
-
unpackb(packed, object_hook=None, list_hook=None, bool use_list=1, encoding=None, unicode_errors=‘strict‘, object_pairs_hook=None, ext_hook=ExtType, Py_ssize_t max_str_len=2147483647, Py_ssize_t max_bin_len=2147483647, Py_ssize_t max_array_len=2147483647, Py_ssize_t max_map_len=2147483647, Py_ssize_t max_ext_len=2147483647) <==> loads
- 反序列化对象。提供了loads来兼容
-
pack(o, stream, **kwargs) <==> dump
- 序列化对象保存到文件对象。提供了dump来兼容
- unpack(stream, object_hook=None, list_hook=None, bool use_list=1, encoding=None, unicode_errors=‘strict‘, object_pairs_hook=None, ext_hook=ExtType, Py_ssize_t max_str_len=2147483647, Py_ssize_t max_bin_len=2147483647, Py_ssize_t max_array_len=2147483647, Py_ssize_t max_map_len=2147483647, Py_ssize_t max_ext_len=2147483647) <==> load
- 反序列化对像保存到文件对象。提供了load来兼容
以上是关于Python第六周 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章