码迷,mamicode.com
首页 > 其他好文 > 详细

文件操作

时间:2018-09-02 20:56:06      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:就是   指针   操作符   python   file   st3   迭代   比较   经典   

文件操作

文件对象,就是操作这个文件的一个代理 通过这个代理 就可以调用系统相应的API接口 然后就可以 来操作这个文件了
例 :f = open("test") 或者 open("test1") as f
文件操作完之后一定要 close 关闭
open(指定路径-----打开或要创建的文件名):如果不指定,默认是当前路径
默认打开方式:mode = ‘rt‘ 以只读和字符的模式打开
open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

模式
rw 不能同时写在一起,只读与只写发生冲突
r:缺省值,表示只读打开
w:只写打开,当文件名重名时覆盖前一个文件(不建议直接操作)
当文件写入之后,不会直接将数据写入文件中,会在缓冲区域停留一段时间
x:创建并写入新文件,当文件重名时报错
a:写入打开,如果文件存在,则追加数据,不存在,则创建一个文件(应用场景,追加日志)
b:二进制模式,以二进制显示表达
t:缺省值,文本模式,以字符计算,显示表达
+:增加功能,给原来只读、只写方式打开,提供缺失的读或写功能
+的功能都是附加,主题还是以主体的r或者w为主,先遵循主体的功能再附加功能
r+:给只读操作加入写入功能,(使用r+时有风险存在,在读取时又写入了新的数据,使得原数据被覆盖,导致二进制位移,从而产生了乱码) 原理是因为seek(指针) 指针移动到了最左边0的位置,写入执行后,数据重0的位置开始覆盖原字符数据
w+:给只写操作增加读取功能,
文件写入,在文件关闭之后才写入数据 这里是因为seek的原因,写完之后指针已经指向末尾,所以看不见
文本模式t字符流,将文件的字节按照某种字符编码理解,按照字符操作。
python3 和 linux 默认字符编码为:UTF-8 open默认mode是rt
二进制模式,将文件按字节理解,与字符编码无关/二进制模式操作时,字节操作使用bytes类型
文本模式下的操作
seek(是按字节来走步长的)步长单位字节
seek() 走n步(偏移量) 0开头(缺省值) 1相对位置 2结尾
f.seek(3) == f.seek(3,0) 从开头位置向后走三位(默认0,从头开始)
f.seek(0,1) 从相对位置走0步(相对位置,上一次操作完的位置)
但是造作相对位置时,步长是非零时,报错 此时文本模式步长只能为0
f.seek(0,2) 从结尾处走0步,返回字符长度
当f.seek( ,1,2)当后面的位置参数是 1或者2 时 此时的步长操作只能为0
在字节模式下
我们是可以用 1 相对位置、2结尾,可以进行前后的步长位移
支持向左 但是都不支持,向左超界
当使用0开头向右超界后,再使用2 则回到的是有字节的那个结尾位置

缓冲区:buffering

可以看做一个先进先出的序列,临时将数据缓冲在一起,等满足触发条件后一次性写入数据
(缓存、缓冲区一般是在内存上的一个空间,可以在其他的存储设备上开辟空间,但是由于其他存设备的效率太慢,一般不适用)
缓冲区是一个内存空间,一般来说是FIFO队列,到缓冲区满了或者到达阈值,数据才会flush到磁盘或其他存储上面
flush()将缓存器数据写入磁盘 使用close()关闭时,缓冲区会自行调用flush()将数据写入磁盘,然后缓冲区清空

-1表示使用缺省值大小buffer
二进制模式,使用io.DEFAULT_BUFFER_SIZE,查看默认值,默认大小一般为4096或者8192
文本模式,如果是终端设备,是 行缓存方式, 不是,则使用二进制模式的策略

0 只在二进制模式下使用,表示关闭buffer
1在文本模式下使用,表示行缓存。意思是:见到行缓存付就flush
1在字节模式下使用,表示按自己缓存,1即1个字节就缓存
大于1
字节模式下使用:则是指定buffer的大小,flush完后 把当前字符串写入磁盘
文本模式下使用:表示行缓冲大小,缓冲区的值可以到达设置的默认值,直到超过设定的阈值才会把缓冲区flush

1.文本模式,一般都使用默认缓冲区大小
2.二进制模式,是按字节操作,可以指定buffer的大小
3.一般来说,默认缓冲区大小是比较好的选择,除非能明确知道,否则一般不建议自行调整
4.一般编程中,明确知道需要写磁盘了,都会手动调用flush一次,而不是等自动flush或者close的时候

encoding:编码,仅文本模式下使用
None表示使用缺省值,依赖操作系统。

其他参数
error什么样的编码错误将被捕获None和strict表示有编码错误将抛出ValueError异常;
ignore表示忽略
newline文本模式下,换行的转换。可以为None,"空串" 、" \r "、 " \n "、"\r\n",None表示将多有的换行符都转换为"\n"

buffering = 0 这是一个特殊的二进制模式下的产物,不使用内存的buffer,可以看做是一个FIFO文件(即写即出)

文件操作符:是有限制的,但是最经典的0,1,2 被保留了下来

read(size = -1)
size表示读取多少个字符或字节;负数或者None表示读取到EOF(结尾)
在文本模式下,按字符来读取数据
在字节模式下,按字节读取数据

readline(hint = 指定行数)按行迭代
f3.open("test3")
for line in f3:
print(line)
f.close()

write()
write(s)把字符串s写入到文件中,并返回字符个数
write(lines)将字符串列表写入文件中

上下文管理

异常处理
当出现异常时,拦截异常。但是,因为很多代码都可能出现OSError异常,还不好判断异常就是因为资源限制产生的

上下文
一种特殊的语法,让解释器去释放文件对象

1.使用with......as 关键字:
2.上下文管理语句块不会开启新的作用域
with语句执行完,会自动关闭文件对象
with f3:
f3.write("moti")
print("-----------")

不管语句有没有报错,只要离开with语句块 ,f3文件就会被关闭,将f3所占用的资源释放掉

文件操作

标签:就是   指针   操作符   python   file   st3   迭代   比较   经典   

原文地址:http://blog.51cto.com/12951676/2169167

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!