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第六周 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记第六周

Python第六周 学习笔记

Python学习笔记——基础篇第六周——logging模块

Python学习笔记——基础篇第六周——shutil模块

Python学习笔记——基础篇第六周——Subprocess模块

Python学习笔记——基础篇第六周——面向对象