共计 3115 个字符,预计需要花费 8 分钟才能阅读完成。
1 Python 文件 IO 操作
罕用操作如下表:
clumn | column |
---|---|
open | 关上 |
read | 读取 |
write | 写入 |
close | 敞开 |
readline | 行读取 |
readlines | 多行读取 |
seek | 文件指针操作 |
tell | 指针地位 |
1.1 open
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 | 文件存在,只写关上,追加内容;文件不存在,则创立后,只写关上,追加内容 |
r 只读,wxa 都是只写 | wxa 都能够产生文件,w 不论文件存在与否,都会生成全新内容的文件;a 不论文件是否存在,都能在关上的文件尾部追加;x 必须要求文件当时不存在,本人造一个文件。 |
文本模式 t | 字符流,将文件的字节依照某种字符编码了解,依照字符操作。默认模式。 |
二进制模式 b | 字节流,将文件依照字节了解,与字符编码无关。二进制模式操作时,字节操作应用 bytes 类型。 |
- 文件指针
mode = r 指针起始在 0
mode = a 指针起始在 EOF(文件开端)
- seek(offset[,whence]) 挪动指针. offset 偏移多少字节。
文本模式下:
whence 0 缺省值,示意从头开始,只承受正整数
whence 1 示意从以后地位,只承受 0
whence 2 示意从 EOF 地位开始,只承受 0
字节模式:
wence 0 缺省值,示意从头开始,offset 只承受正整数
whence 1 示意从以后地位,offset 可正可负
whence 2 示意从 EOF 地位开始,offset 可正可负
1.2 罕用函数
函数 | 阐明 |
---|---|
read(size=-1) | 默认读取所有,文本模式下为读取字符数量,字节模式下为字节数 |
readline(size=-1) | 一次读取多少行内容,默认所有 |
readlines | 读取多行内容 |
write(s) | 把字符串 s 写入到文件中,并返回字符的个数 |
close() | flush 并敞开文件对象,敞开后,再次敞开没有成果 |
1.3 其余函数
函数 | 阐明 |
---|---|
seekable() | 是否可 seek |
readable() | 是否可读 |
writeabel() | 是否可写 |
closed() | 是否曾经敞开 |
2 上下文治理
先看一个例子
lst = []
for _ in range(2000):
lst.append(open("test"))
# OSError: [Errno 24] Too many open files:'test'
print(len(lst))
ulimit -a 查看所有限度,其中 open files 就是关上的文件数限度,默认 1024。
(base) zhaow@zhaow-610:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 62945
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 62945
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
解决办法:
1. 异样解决
当出现异常的时候,拦挡异样,然而很多代码都可能呈现 OSError 异样,还不好判断异样就是因为资源限度产生的。
f = open('test')
try:
f.write('abc')
finally:
f.close()
应用 finally 能够保障所有文件能够被敞开。
上下文治理
一种非凡的语法,交给解释器去开释文件。
with open('test') as f:
f.read()
应用 with…as 关键字:
上下文治理语句并不会开启新的作用域
with 语句块执行完的时候,会主动敞开文件对象
对应相似文件对象的 IO 对象,一般来说都须要在应用完的时候敞开、登记,以开释资源。
IO 被关上的时候,会取得的文件描述符 fd,但计算机资源是无限的,所以操作系统都会做限度,目标是为了保护计算机资源不要被齐全耗尽。
个别状况下,除非特地明确的晓得资源状况,否则不要进步资源的限度来解决问题。
3.StingIO 和 BytesIO
- StingIO
io 模块中类:from io import StringIO
内存中,开拓的一个文本模式的 buffer,能够像文件对象一样操作它
当 close 办法被调用的时候,这个 buffer 会被开释
getvalue() 获取全部内容,跟文件指针没有关系
示例
from io import StingIO
sio = StringIO() # 跟文件操作相似
sio.write("test context")
sio.seek(0)
print(sio.getvalue())
print(sio.readline())
sio.close()
- BytesIO
io 模块中类:from io import BytesIO
内存中,开拓的一个二进制模式的 buffer,能够像文件对象一样操作它
当 close 办法被调用的时候,这个 buffer 会被开释
getvalue() 获取全部内容,跟文件指针没有关系
与 StringIO 类似。
一般来说,磁盘操作比内存操作慢的多,内存足够的状况下,个别的优化是少落地,缩小磁盘 IO 的过程,可大大提高程序的运行效率。
4. 门路操作
3.4 版本之前:os.path 模块
示例 1
from os import path
p = path.join('/etc'. 'sysconfig', 'network')
print(type(p), p)
print(path.exists(p))
print(path.split(p))
print(path.abspath('.'))
p = path.join('o:/', p, 'text.txt')
print(path.dirname(p))
print(path.basename(p))
print(path.splitdrive(p)) # window 下应用
3.4 版本之后:pathlib 模块
示例 1
from pathlib import Path
p = Path()
p.absolute() #绝对路径
p = p.joinpath('a','b')
p.absolute()
p = p / 'c' #拼接 等价于 p / = 'c' , p = p.joinpath('c')
#目录初始化
p = Path() #当前目录
p = Path('a', 'b', 'c/d') #当前目录下 a /b/c/d
p = Path('/etc')