f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,
那么打开文件的默认编码很明显是操作系统说了算了,
操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')
(文本文件)文件只读模式:
f = open('a.txt',mode='r',encoding='utf-8')
data = f.read()
print(data)
mode 默认为读模式,不能写
print(f.readline(5),end='') #第一行,后边可以跟几个字节
print(f.readlines(),end='') #读所有,文件放到列表中
上下文管理:
with (open('a.txt',mode='r',encoding='utf-8')) as f:
print(f.read())
## as 赋值
文件只写模式:
f = open('a.txt',mode='w',encoding='utf-8')
f.write('hello
') #写模式 文件存在清空,不存在则新建
f.write('123
')
f.write('987
')
l = ['one
', 'two
', 'three
','fore
'] #把列表放在文件里
换行符
# for line in l:
# f.write(line)
f.writelines(l) #####直接把列表写在文件里
追加模式:
##a: 追加模式,文件存在则把光标移动到末尾,文件不存在则新建
f = open('a.txt',mode='a',encoding='utf-8')
data = f.write('you are pig
') ##追加也是write
#####把文件按行打印:
f = open('a.txt', mode='r', encoding='utf-8')
##方法一:
# data = f.readlines()
# for line in data:
# print(line)
######方法二:
# while True:
# line =f.readline()
# if len(line) == 0:
# break
# print(line,end='')
######方法三:
# for line in f:
# print(line,end='')
####b:以bytes的形式操作文件内容
#视频文件 b:以 bytes (最原始的二进制) 不能直接往硬盘写字符串 的形式去操作文件内容
t = open('egon.jpg',mode='rb')
data = t.read()
print(data)
##wb bytes 模式不能是str 字符串,写入必须转换为 utf-8
t = open('a.txt',mode='wb')
data = t.write('hhhhhhhhhhh'.encode('utf-8'))
##ab 追加模式
t = open('a.txt',mode='ab')
data = t.write('xxxxxxx
'.encode('utf-8'))
data = t.write('fffffffff
'.encode('utf-8'))
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】
#2. 对于非文本文件,我们只能使用b模式,
"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
#了解
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name
####修改文件内容
import os
with open('e.txt',mode='r',encoding='utf-8') as data_r,
open('.e.txt.swap','w',encoding='utf-8') as data_w:
data = data_r.read()
data = data.replace('alex','sb')
data_w.write(data)
#print(type(data))
os .remove('e.txt')
os.rename('.e.txt.swap','e.txt')