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 -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 62945max locked memory (kbytes, -l) 65536max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 62945virtual memory (kbytes, -v) unlimitedfile 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 StingIOsio = 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 pathp = 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 Pathp = 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/dp = Path('/etc')