文件操作
假设程序执行当前文件夹下存在test.txt
this is line 1
this is line 2
this is line 3
this is line 4
this is line 5
this is line 6
this is line 7
this is line 8
this is line 9
2.文本只读操作
f = open("test.txt", "r", encoding="utf8")
# 注意:每读取一定数据,游标就移动到相应的位置
charge = f.readable() # 判断文件是否可读
data = f.read() # 一次性读取所有数据
data = f.readline() # 读取一行信息
data = f.readlines() # 将所有的内容弄成一个列表,每行的内容为一个元素
f.close() # 使用完毕要关闭文件句柄,释放系统资源
print(data)
3.文本只写操作
”w”模式会将存在的文件清空再操作,不存在就新建
w 很危险,存在的文件一执行就会覆盖,慎重!
f=open('test.txt','w',encoding='utf8') #
f.writable() # 判断是否可写
f.write('11111111\n')
f.writelines(['555\n','6666\n']) # 参数是一个列表,列表里面的元素只能为字符串
f.close()
4.文本只追加操作
f=open('test.txt','a',encoding='utf-8') # 追加方式,游标直接指向末尾
f.write('我写到文件最后')
5.文本+模式操作
f=open('test.txt','r+',encoding='utf-8') # 读写操作,打开时游标指向开头
f.write('123sb') # 打开后直接写,指针指向开头,会覆盖原来的对应字节的内容
data=f.read()
print(data)
f.write('123sb') # 经过读操作,指针指向末尾,写为追加到最后
f=open('test.txt','w+',encoding='utf-8') # 只要存在 w 先清空,后操作!
f.close()
f=open('test.txt','a+',encoding='utf-8') # 追加读写,游标默认在文件尾
f.write("dfadf sdafa")
6.binary操作文件模式
注意:
- 文件打开默认为文本方式
- binary操作模式不能指定字符编码,因为是二进制,所以不需要编码
- window平台回车是\r\n ; unix linux 为\n \x开头表示
- 为十六进制
'字符串'---------encode--------->bytes
'字符串'<--------decode----------bytes
# 以二进制读文件,然后进行解码
f=open('test.txt','rb')
data=f.read()
print(data)
print(data.decode('utf-8'))
f.close()
# 以二进制方式写文件,指定转换为对应编码的二进制
f=open('test.txt','wb')
f.write(bytes('1111\n',encoding='utf-8'))
f.write('杨件'.encode('utf-8'))
f.close()
# 二进制方式追加,将内容编码后追加到文件最后
f=open('test22.py','ab')
f.write('杨件'.encode('utf-8'))
f.close()
# 不知道编码的情况下,latin-1会尽可能多的还原
f=open('test.txt','r+',encoding='latin-1')
data=f.read()
print(data)
f.write('aaaaaaaaaaa')
# newline='' 读取文件中真正的换行符号(由于平台的不同,py3处理了一下)
# win\r\n <---> \n unix/linux
f=open('test.txt','r',encoding='utf-8',newline='')
data = f.read().encode("utf8")
print(data) # b'1\r\n2'
f.close()
f=open('test.txt','r',encoding='utf-8')
data = f.read().encode("utf8")
print(data) # b'1\n2'
f.close()
# 判断文件是否关闭了
f = open('test.txt','r',encoding='utf-8')
print(f.closed)
f.close()
# 查看打开文件所用的编码方式
f=open('test.txt','r',encoding='gbk')
print(f.encoding) # gbk
f.close()
# 刷新,将内存里面的东西保存在文件中
f = open("test.txt","ab+")
data = b"adfaeadfjiefka"
f.write(data)
f.flush() # 刷新
f.close()
光标操作
# f.tell() 告诉当前游标的位置,以字节为单位
f = open("test.txt","rb")
f.readline()
print(f.tell())
f.close()
# f.seek() 用于控制光标的移动(字节为单位)
f = open("test.txt","rb+")
f.readline()
f.seek(3) # 相对于0的位置进行移动
f.seek(10,1) # 参数 1 为,相对于上一次光标移动的位置(b的方式),可正可负
f.seek(-5,2) #相对于文件末尾,参数2,必须为负数
print(f.read().decode('utf8'))
f.close()
# f.read(n) #以字符为单位读取文件
f = open("test.txt","r")
print(f.read(4))
f.close()
# f.truncate((n) # 以字节为单位截取文件,必须存在写模式才能如此操作
f = open("test.txt","rb+")
f.truncate(3)
f.close()
读取大文件的方法
方式一:
f=open('test.txt','rb') # 这个效率低
lis = f.readlines()
data = lis[len(lis) - 1]
print(data)
方式二:
offset = -4
data_lis = None
with open("test.txt" ,"rb") as f:
while True:
f.seek(offset,2)
data_lis = f.readlines()
if len(data_lis) > 1:
break
else:
offset *= 2
print(data_lis[1].decode("utf8"))
7.with的使用
with关键字,可以省去close()操作,with块结束后会自动调用close
with open('a.txt','w') as f:
f.write('1111\n')
with open('test.txt','r',encoding='gbk') as src_f,\ # \ 为python中代码换行的标志
open('xxx_new','w',encoding='gbk') as dst_f: # with可以同时打开多个操作
data=src_f.read()
dst_f.write(data)
补充:第三方智能检测字符编码工具chardet,能最大限度的识别字符的编码方式
需要在线安装:
pip install chardet
result = chardet.detect(open("log",mode="rb").read())
print(result)