open 打开 close 关闭 seek 文件指针操作
read 读取 readline 行读取 tell 指针位置
write 写入 readlines 多行读取
文件操作中,最常用操作就是读和写
文件访问的模式又两种:
文本模式 和 二进制模式
不同模式下,操作函数不尽相同,表现得结果业不一样
open 得参数
file 打开或者要创建得文件名。如果不指定路径,默认是当前路径
r 缺省的,表示只读打开
w 只写打开
x 创建并写入一个新文件
a 写入打开,如果文件存在,则追加
b 二进制模式
t 缺省的,文本模式
+ 读写打开一个文件。给原来只读、只写方式打开提供缺失的读或写的能力
文件指针,指向当前字节位置
whence 0 缺省值,表示从头开始,offest 只能正整数
whence 1 表示从当前位置,offest 只接受 0
whence 2 表示从EOF 开始,offset 只接受 0
whence 0 缺省值,表示从头开始,offest 只能正整数
whence 1 表示从当前位置,offest 可正可负
whence 2 表示从EOF 开始,offest 可正可负
-1 表示使用缺省大小的buffer 。 如果是二进制模式,使用io.DEFAULT_BUEFER_SIZE值,默认是4096或者8192。如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。
None 表示使用缺省编码,依赖操作系统。
closedfd
关闭文件描述符,True 表示关闭它。False 会在文件关闭后保持这个描述符。
使用with...as...关键字
上下文管理的语句块并不会开启新的作用域
with 语句块执行完的时候,会自动关闭文件对象
# 文件copy 简单实现
filename1 = '/tmp/test.txt'
filename2 = '/tmp/test1.txt'
f = open(filename1,'w+')
lines = ['abc','123','magedu']
f.writelines('\n'.join(lines))
f.seek(0)
print(f.read())
f.close()
def copy(src,dest):
with open(src) as f1:
with open(dest,'w') as f2:
f2.write(f1.read())
copy(filename1,filename2)
一般来说,磁盘的操作比内存的操作要慢的多,内存足够的情况下,一半的优化思路是少落地,减少磁盘IO 的过程,可以大大提高程序的运行效率
io 模块中的类(from io import BytesIO)
内存中,开辟的一个二进制模式的buffer,可以向文件对象一样操作
当close 方法被调用的时候,这个buffer 会被释放
from io import BytesIO
bio = BytesIO()
print(bio.readable(),bio.writable(),bio.seekable())
bio.write(b"joker\nPython")
bio.seek(0)
print(bio.readline())
bio.seek(0)
print(bio.read())
print(bio.getvalue()) # 无视指针,输出全部内容
bio.close()
类文件对象,可以相文件对象一样操作
socket 对象,输入输出对象(stdin,stdout)都是类文件对象
from sys import stdout
f = stdout
print(type(f))
f.write('joker')
from pathlib import Path
import os
os.stat('/tmp/test')
os.chown(path,uid,gid)
改变文件的属主,属组,但是需要足够的权限
import shutil
with open('/tmp/test','w+') as f1:
f1.write('abcd\n1234')
f1.flush()
f1.seek(0)
with open('/tmp/test1','w+') as f2:
shutil.copyfileobj(f1,f2)
copyfile(src,dst,*,follow_symlinks=True)
复制文件内容,不含元数据。src,dst 为文件的路径字符串
本质上调用的就是copyfilebj,所以不带元数据二进制内容复制。
copymode(src,dst,*,foolow_symlinks=True)
仅仅复制权限
copystat(src,dst,*,follow_symlinks=True)
rm 删除
shutil.rmtree(path,ignore_errors=False,onerror=None)
递归删除。如同rm -rf 一样危险,慎用。
move 移动
move(src,dst,copy_function=copy2)
递归移动文件,目录到目标,返回目标
https://www.ietf.org/rfc/rfc4180.txt
逗号分割值Comma-Separated Values.
CSV 是一个被行分割符,列分隔符划分成行和列的文本文件。
csv 不指定字符编码
h行分隔符为\r\n,最后一行可以没有换行符
列分隔符常为逗号或者制表符。
每一行称为一条记录record
字段可以使用双引号括起来,也可以不使用。如果字段中出现了双引号,逗号,换行符必须使用双引号括起来。如果字段的值是双引号,使用俩个双引号表示一个转义。
表头可选,和字段列对齐就行。
from pathlib import Path
p = Path('/tmp/mycsv/test.csv')
parent = p.parent
if not parent.exists():
parent.mkdir(parents=True)
csv_body = '''\
id,name,age,comment
1,joker,18,"I'm 18"
2,ls,20,"this is a ""test"" string."
3,ww,23,"你好
世界"
'''
p.write_text(csv_body)
ini 文件处理
作为配置文件,ini 文件个事的流行
[DEFAULT]
a = test
[mysql]
default-character-set=utf8
[mysqld]
datadir = /dbserver/data
port = 3600
character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
configparaser模块的ConfigParser类
可以将section当作key,section 存储着键值对组成的字典, 可以把ini配置文件当做一个嵌套的字典。默认使用的是有序字典。
serialization 序列化
将内存中对象存储下来,把他们变为一个个字节。-> 二进制
deserialization 反序列化
将文件的一个个字节恢复成内存中对象。 <- 二进制
序列化保存到文件就是持久化。
可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者网络接收到的字节序列反序列化。
dumps 对象序列化为bytes 对象
dump 对象序列化到文件对象,就是村人文件
loads 从bytes 对象反序列化
load 对象反序列化,从文件读取数据
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。