一,文件打开模式:
r 以只读的模式打开,该文件必须存在,否则会报错。
w 以只写的模式打开,若文件存在则文件长度清为0,即该文件内容会消失。
若文件不存在则建立该文件。
a 以追加的模式打开,若文件不存在,则会建立该文件,如果文件存在,
写入的数据会被加到文件尾,即文件原先的内容会被保留。
x python3之后加上去的,如果文件存在,则报错,不存在则创建并只写
rb #详见下文
wb
ab
r+ 打开可读写的文件,该文件必须存在。不会创建不存在的文件,从顶部开始写,
会覆盖之后此位置的内容(常用,因为可以用seek调整从哪开始写,但是要注意
会向后覆盖,如果碰到汉字,汉字一般包含3个字节,如果从第2个开始则会出现
乱码。可以参考seek的用法)
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。
若文件不存在则建立该文件。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,
写入的数据会被加到文件尾后,即文件原先的内容会被保留。
r+b 以读写的模式打开(默认按字符串向后读,如果加b,则按字节向后读)
(b代表二进制,一般在程序需要跨平台的时候会使用)
w+b 以读写的模式打开
a+b 以追加及读模式打开
二,文件操作
f = file('/etc/passwd')
f.readline() 一次只读一行
f.readlines() 返回的是读到的行的一个列表
f.read() 无参数,读全部,有参数(有b按字节读,无b按字符读)。
f.read(5),表示读取前5个字符/字节。
f.readlines() 一次只读取一行(不会因为文件太大,在读取的时候而出现内存不足)
f2.readable() 是否可读
f.seek() 跳转到一个指定的位置(按字节找,不管是有中文,还是字符都一样)
f.tell() 获取当前所在位置(按字节)
f.truncate() 截取文件,指针位置后面的将被清空
f.write() 先清空文件写数据。(有b时,按字节写;无b时,按字符写)
f.flush() 强制把数据从内存刷到硬盘
f.close() 关闭文件
f.writelines()
f.closed 测试文件是否关闭
注意open和file都可以对文件进行处理,没有区别。但是在python3中只保留open
三,关于文件操作的模式是否带b,以及乱码问题的处理?
1,我们在对文件进行操作时不加b的情况下,打开读取,写入都是以字符串的形式来进行。
而我们保存在硬盘上的数据只可能是二进制(二进制的表现形式就是字节类型),这中间
python内部帮助我们做了转换,把字符转换成字节,不需要我们自己来做。
注意:我们在写数据,保存数据的时候最好养成一个好的习惯,即以什么编码写的就以什么
编码来打开,否则会出现乱码的情况。
2,(rb,wb,ab)只要加b,就表示不需要python来帮我们来做,我们直接跟二进制打交道。
这时候我们在写的时候也必须写字节,否则会报错。以后做跨平台项目时经常用+b的模式。
-
如:
-
cat user.txt #查看文件内容
-
yn:yn123
-
tom:tom123
-
----------------
-
with open('user.txt','rb') as f1:
-
for line in f1:
-
print(line,type(line))
-
-
with open('user.txt','ab') as f2:
-
f2.write(bytes("李杰", encoding="utf-8")) #如果不用bytes进行转换则会报错。
-
-
-
结果:
-
b'yn:yn123\r\n' <class 'bytes'>
-
b'tom:tom123' <class 'bytes'> #可以看出都是字节类型
-
-
-----------------
-
cat user.txt
-
yn:yn123
-
tom:tom123李杰 #再次查看文件内容
-
-----------------
四,补充:
1)如何对文件对象进行迭代
f1 = open('user.txt','r',encoding='utf-8')
for line in f1:
print(line) #一行一行的读取文件
2) 文件操作with处理上下文(2.7以后with可以打开两个文件)
(a),把db1的前十行,写入db2的前十行
-
with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding="utf-8") as f2:
-
times = 0
-
for line in f1:
-
times += 1
-
if times <= 10:
-
f2.write(line)
-
else:
-
break
(b),修改文件,把'alex'替换成'st'
-
with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding="utf-8") as f2:
-
for line in f1:
-
new_str = line.replace('alex','st')
-
f2.write(new_str)
阅读(1174) | 评论(0) | 转发(0) |