文件操作


打开操作

  • 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来兼容