文件处理

打开文件的方式

方式一:

1. 打开文件,得到一个句柄并赋值给一个变量
f=open("aa","r",encoding="utf8")
2. 通过句柄对文件进行操作
data=f.read()
3. 关闭文件
f.close()

方式二:

with open("aa","r",encoding="utf8") as f:
    data=f.read()

打开文件的模式

r,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a,追加写模式【不可读;不存在则创建;存在则只追加内容】

rb,二进制只读模式
wb,二进制只写模式
ab,二进制追加模式

"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】

x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】
xb

操作文件的方式

f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中

f.write('1111
222
') #针对文本模式的写,需要自己写换行符
f.write('1111
222
'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333
','444
']) #文件模式  自己写换行符

文件的光标问题

f.seek()
f.seek(0) 从文件开头重新开始读取
s.seek(offset,whence=0)
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。
seek(0,0) 默认移动到文件开头或简写成seek(0)
seek(x,1) 表示从当前指针位置向后移x(正数)个字节,如果x是负数,则是当前位置向前移动x个字节
seek(x,2) 表示从文件末尾向后移x(正数)个字节,如果x负数,则是从末尾向前移动x个字节

典型的例子:模仿tail -f 
import time
with open('test.txt','rb') as f:
    f.seek(0,2) #将光标移动到文件末尾,再向后移动0个字节数 从文件末尾开始读
    while True:
        line=f.readline()
        if line:
            print(line.decode('utf-8'))
        else:
            time.sleep(0.2)

修改文件的方式

import os
#以只读的方式打开源文件 以写的方式创建新的文件
with open('aa.txt','r',encoding='utf-8') as r_f,open('bb.txt','w',encoding='utf-8') as w_f:
    for line in r_f: #将源文件内容写入新文件  并且修改
        if line.startswith('你好'):
            line='修改了
'
        w_f.write(line)
#目前就有了两个文件,但是只需要一个修改后的文件,原理就是删除源文件,将新文件重命名
##删除和重命名文件
os.remove('aa.txt')
os.rename('bb.txt','aa.txt')

二进制方式操作文件

读出二进制文件的方法:
with open('aa','rb') as f:
    print(f.read())
    f.seek(0)
    print(f.read().decode('gbk')) #windows上是gbk
'''
b'xbbxb9xd3xd0xcaxabxbaxcdxd4xb6xb7xbd
'
还有诗和远方
'''

写入二进制文件的方法:

with open("aa","wb") as f:
    f.write("还有诗和远方
".encode("utf8"))

使用二进制方式,保存图片

with open('ff.jpg','rb') as read_f,
        open('wuwu_new.jpg','wb') as write_f:
    write_f.write(read_f.read())
原文地址:https://www.cnblogs.com/lazyball/p/11648131.html