乐趣区

关于python:四Python中文件操作和路径操作

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')
退出移动版