文件操作
打开操作
-
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来兼容