python文件操作

1 文件操作流程

1 打开文件

对操作系统发起系统调用
要操作文件,需要获得文件的句柄。可以通过open()来获取文件的句柄。

f=open("file_path",mode="r",encoding="utf-8") 

f就是文件的句柄
对文件的操作,也就是对句柄的操作。
encoding默认的是以系统默认的编码方式。(windows默认gbk,mac和linux默认utf-8)


## 2 操作文件

包括对文件的读和写。下面具体介绍

3 关闭文件

f.close()

python提供了另一个方法来避免忘记写close()的方法。

with open("file_path",mode="r",encoding="utf-8") as f

通过控制块的范围,当代码运行超出范围时,自动执行close()。推荐使用with as。
注意:文件内容在内存中,什么时候会写入磁盘?只有强制使用flush()刷新,手动调用close()或程序结束,内容会一次性从内存写入文件。


2 文件的操作具体内容

每一次使用open(),光标都会被重置到文件开头位置。

文件的操作,可以是对字符的操作和字节的操作。

1 文件的权限控制

r    字符可读,文件不存在报错
w    字符可写,文件不存在,创建
a    字符追加(append),文件不存在,创建
r+   字符可读可写(读的时候,从光标(光标默认在开始)位置开始读,写的时候是从光标所在位置开始写) 文件不存在报错
w+   字符可读可写(读是光标位置开始读(可通过seek调节位置),写的时候都是覆盖写)  文件不存在,创建
a+   字符可读可写(光标默认在最后,必定在最后追加写) 文件不存在,创建
rb   二进制可读
wb   二进制可写
ab   二进制追加
rb+  二进制可读可写
wb+  二进制可读可写
ab+  二进制可读可写

r+、w+、a+和rb+、wb+、ab+除了一个是处理字符,一个处理字节,其他特性都一样。这里我们只研究前3个处理字符的。

fd = open("111.txt",'w+')

w+模式是只要运行上面这条指令,如果111.txt,不存在就创建。如果存在,且里面有内容,则会直接执行清空。之后再执行读写操作。读是光标位置开始读(可通过seek调节位置),且只能在同一个文件句柄中读取出写入的内容(如下面这种,flush与否都能read出来“234”),写的时候都是覆盖写。

fd = open("111.txt",'r+')
fd.write("234")
#fd.flush()
fd.seek(0)
print(fd.read())

r+如果文件不存在,就直接报错。读的时候,从光标位置开始读(光标默认在开头),写的时候是从光标所在位置开始写(默认在结尾,追加写)。

fd = open("111.txt",'a+')
#fd.seek(0)
print(fd.read())

a+文件不存在,创建。读的时候从光标位置开始读(光标默认在末尾),写的时候必定在最后追加写。

2 字符的操作

  1. 文件的读
f.read()   #一次性将文件的全部内容读入系统(文件过大,可能会报错)
f.read(5)   #一次读5个字符(节)
f.readable()  #判断可读权限
f.readline()   #返回一行,后面有\n,光标移动到下一行行首
f.readlines()   #以列表的形式返回文件的所有行内容(不推荐使用)
for line in f  #f是迭代器,每次只返回一条结果,不会因文件过大,而出现内存错误,优于readlines()
  1. 文件的写
f.write("abc") #把“abc”写到文件,并返回相应的字符(节)个数
f.writelines([list])  #一次写多行
f.truncate(3)   #从光标位置开始向后截取3个字符
f.writable()  #判断可写权限
f.flush()    #强制把内存里的内容写入磁盘
一但文件写入磁盘,就不可能再向文件插入内容
  1. 重点:
    光标的移动:
f.seek(0) #把光标移动到开头(按字节)
f.tell()  #返回当前光标的位置
f.seek(3,0)  #0表示光标从开头位置开始
f.seek(3,1)  #1表示光标从当前位置开始向后移动3个字节
f.seek(-3,2)  #2表示光标从结尾开始,-3表示向前移动3个字节。此处若为3,是说光标继续向后移动3个字节,会报错。

3 字节的操作

with open("111.txt","rb+") as f:
    f.write("hello李".encode("utf-8"))
posted @ 2017-04-24 20:27  思否丶  阅读(174)  评论(0编辑  收藏  举报
return