python3_文件操作

文件操作


open函数

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

file
the path name of the file to be opened
or an integer file descriptor
将文件描述符包装成文件对象

mode
r 只读打开,找不到就报错FileNotFoundError
w 只写打开,清空原文件,重新写,没有就创建
x 创建新文件,文件已存在报错FileExistsError
a 只写打开,尾部追加,没有就创建
b 二进制模式
t 文本模式
+ 提供缺失的读或者写, 少用

buffering
缺省缓存区大小 io.DEFAULT_BUFFER_SIZE
-1 表示使用缺省大小的缓存区
b 模式表示指定buffer大小,0表示关闭buffer
t 模式必须>=1, 等于1表示行缓冲

encoding
windows 缺省GBK ,linux 缺省UTF-8

newline 换行符转换可以是:None、'' 、\n 、\r\n

  • 读时,None表示’\r’,’\n’,’\r\n’都被转换为’\n’,
    ”表示不转换通配符, 其他合法字符表示换行符就是指定字符
  • 写时,None表示’\n’都会被系统缺省行分隔符os.linesep
    替换,其他字符,表示’\n’会被替换为指定字符

closefd
关闭文件描述符 True表示关闭 False表示保留
os.open()打开文件获得文件描述符
.fileno()查看文件描述
当第一个参数是file descriptor, 文件被关闭时, the underlying file descriptor will be kept open

一个文件可以被打开多次, 一个写入(记得flush), 一个读取
文件对象的一些方法:
文件对象可迭代, 迭代每一行
.flush() 将缓冲区数据写入磁盘
.close() 关闭前会调用flush()
.tell() 显示指针位置0->EOF(end of file)
seek(offset[, whence])
offset偏移字节数, t模式offset必须是0, b模式offset可以是负数, 但负向不可越界, 正向可越界
whence开始位置:
0:从头开始,只能是正整数
1:当前位置开始
2:EOF开始

.read(size=-1)
size表示读取多少字节或字符,负数/None表示读到EOF
readline(size=-1) 一行一行读取,size每行读取字节/字符数
readines(hint=-1) 读取所有行,读到hint字节/字符数所在行
‘r+’ 模式下, read 不管一次读取几个字符,再write都是在尾部写入

.write(s) -> 返回写入字符数
writelines(lines) lines表示字符串列表, 这样写入, 不会加入换行符

.close()
.seekable()
.readable()
.writable()
.closed()

上下文管理

with open('test') as f:
with fileobj:

StringIO & BytesIO

from io import StringIO
内存中,开辟的一个文本模式的buffer,可以像文件一样操作它
getvalue()方法可以获取buffer中的内容
当close方法调用时,释放这个buffer
内存足够的情况下,一般的程序优化思路是少落地,减少磁盘IO

from io import BytesIO

类文件对象对象 file-like
socket对象、标准输入输出对象(stdin、stdout)等


路径操作

路径的本质就是字符串

os.path模块

p = path.join(‘o:/’,’test.txt’)
path.exists(p) 路径是否存在
path.split(p) -> (dirname, basename)
path.abspath(‘.’) -> 当前目录的绝对路径
path.dirname(p)
path.basename(p)
path.splitdrive(p) -> (head, rest)
path.abspath(__file__) -> 当前模块的绝对路径

os模块其他方法

os.name windows: nt linux: posix
POSIX: Portable Operating System Interface of UNIX可移植操作系统接口
os.uname() unix支持, 同命令uname -a
sys.platform widows: win32 linux: linux
os.listdir(‘/tmp’) -> 目录内容列表
os.stat(path, *, dir_fd=None, follow_symlinks=True)
os.chmod(path,mode,*,dir_fd,follow_symlinks)
os.chown(path, uid, gid)


pathlib模块

from pathlib import Path
初始化:p = Path()
p = Path(‘a’,’b’,’c/d’)
p = Path(‘/etc’)
操作符:/, Path和str拼接, 或Path和Path拼接
分解:.parts -> tuple, 将路径全部拆分
添加:.joinpath(Path,str) -> Path, 返回一个新的Path对象
父目录:.parent.parent.parent 获得Path的父目录
.parents 父目录序列, 可迭代
.name basename
.stem basename的前缀
.suffix basename的后缀
.suffixes 所有后缀, ‘.x.p’ ->[‘.x’, ‘.p’]
.with_suffix(suffix) 添加后缀,如果已经有后缀则替换, 后缀格式.*
with_name(name) 替换basename

类方法:
Path.cwd() -> os.getcwd() cwd, current working directory
Path.home() -> os.path.expanduser(‘~’)
实例方法:

.is_dir() 目录
.is_file() 普通文件
.is_symlink() 软连接
.is_socket() socket文件
.is_block_device() 块设备
.is_char_device() 字符设备
.is_absolute() 绝对

.resolve() 同absolute, 软连接被解析
.absolute() 绝对路径
.exists() 是否存在
.rmdir() 删除路径对应的文件夹
.touch(mode=0o666, exist_ok=True) 创建路径对应的文件
.as_uri 返回路径的URI
.mkdir(mode=0o777,parents=False,exist_ok=False)
.iterdir() -> generator 当前目录所有文件路径

.glob(pattern) -> generator
当前目录所有匹配文件路径
.rglob(pattern) 递归
p.glob('**/*.py') => p.rglob('*.py')
.match(pattern) -> True or False, 匹配就返回True , **/*表示递归匹配
.stat() 同stat命令, 查看文件信息
.lstat() 同stat(),显示软连接本身信息

.open(mode=’r’,buffering=-1,encoding=None,errors
=None,newline=None)
.read_bytes()
.read_text()
.write_bytes()
.write_text(data, encoding=None,errors=None)
获取路径下的左右匹配文件


glob模块

glob.glob(pathname, *, recursive=False) -> list
所有匹配pathname 的文件路径,*表示任意字符
如果recursive为True, **/*.zip 表示递归查找
glob.iglob() 同glob(),返回的是iterator


shutil模块

shutil.copyfileobj(fsrc, fdst[,length]) 源码
打开的文件指针需在seek(0)
.copyfile(src,dst,*,follow_symlinks=True)
.copymode(src,dst,*,follow_symlinks=True)
.copystat(src,dst,*,follow_symlinks=True)

.copy(src,dst,*,follow_symlinks=True) copyfile & copymode
.copy2(src,dst,*,follow_symlinks=True) ocpyfile & copystat
.copytree(src,dst,symlinks=False,ignore=None,
copy_function=copy2,ignore_dangling_
symlinks=False)
ignore = func # 提供一个callable(src, names) ->ignored_names
names: os.listdir(src)

shutil.rmtree(path,ignore_error=False,oneerror=None)
oneerror为callable,接受function,path,execinfo

shutil.move(src,dst,copy_function=copy2)
递归,使用的是os.rename

打包功能 生成tar并压缩,zip,gz,bz,xz.

CSV文件处理

参见:RFC 4180
RFC: 以编号排定的文件, 几乎所有互联网标准都被收录其中

文件格式:
逗号分隔值Comma-Separated Values
CSV 是一个被行分隔符、列分隔符划分成行和列的文本文件
CSV不指定字符编码,人为约定
行分隔符为\r\n,最后一行可以没有换行符
列分隔符为逗号或者制表符
每一行称为一条记录record
字段可以使用双引号括起来,也可以不使用。出现歧义字(”’,\n)符必须使用双引号。
表头可选

csv模块

reader = csv.reader(fileobject) -> row iterable
writer = csv.writer(fileobject)
writer.writerow(row) row -> iterable,list | tuple
writer.writerows(rows)

ini文件处理

格式:

[section] ;节
name=value ;参数, option
;单行注解

使用configpaser模块处理ini文件

cfg = configpaser.ConfigPaser()
cfg.read(filenames: str, encoding=None)
cfg.sections() -> section list
.add_section(section_name)  add a section
.has_section(section_name)  determine whether there is
.options(section)  the section all option,append default option
.has_option(section, option)
.get(section, option, *, raw=False, vars=None[, fllback])
    get value, if not have the option ,get from default
    getint; getfloat; getboolean
.items(raw=False, vars=None)  (sectionname,sectionobj)
.items(section, raw=False, vars=None) [(option,value),..]
.set(section, option, value)   if section presence, set value
.remove_section  remove section and all option
.remove_option(section, option) 
.write(fileobject, space_around_delimiters=True)
字典操作:
    cfg[section][option] = value
cfg._dict  -> OrderedDict
._seciton -> OrderedDict

序列化和反序列化

按照某种protocol(pickle,XML,Json,Protocol Buffer)
将内存中数据 -> 文件(bytes) 序列化 serialization; dump
文件(bytesSequence) -> 内存 反序列化deserialization; load
保存到文件称为持久化

pickle 库

.dumps(object) -> bytes
.dump(object,fileobject: ‘wb’ mode) -> save to file
.loads(bytes) -> object
.load(fileobject) -> object
对象的属性也会被序列化保存到bytes对象

JSON

json的数据类型:
string, number, object, array, true, false, null
json的string,只能使用双引号"",并且是UNICODE字符,
string可以使用转义字符:
\\, \/, \b, \f, \n, \r, \t, \u 4 hex digits
json的number, 支持-负数,浮点数,和科学计数法,-10{e|E}-10
json的object, key必须是string
json 的值value:
object: dict (key must be str,and value is any valid value)
array: list
string: str (example,”string”)
chars: any-Unicode-character
control-character: \”;\;\bfnrt;\u four-hex-digits
number: Int,float
true: True
false: False
null: None

json 模块

function: dumps,dump,loads,load
dumps: obj -> json formated str
loads: str,bytes,bytearray -> python obj
一般json编码的数据很少落地,数据都是通过网络传输。传输的时候要考虑压缩它。本质上就是文本,就是个字符串。

MessagePack

It’s like JSON,but fast and small
安装 pip install msgpack-python
function: packb(dumps),unpackb(loads),pack(dump),unpack(load)

其他模块

import stat
stat.filemode(st_mode)
将一个文件的st_mode: int 转换为字符串形式-rwxrwxrwx

import pwd # 仅unix平台可用
pwd.getpwuid(Path().stat().st_uid).pw_name 获取用户名
Path().owner() 获取用户名

import grp
grp.getgrgid(Path().stat().st_gid).gr_name 获取组名
Path().group() 获取组名

import user_agents # 离线日志分析, user_agents
ua = user_agents.parse(useragent)
ua.browser
ua.browser.family
ua.browser.version
ua.browser.version_string

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值