#写和读取时候,所有的数据只能是字符串,不能是数字或者其他内容
#新建一个文件;冰倩写入文件内容为:这是一个新的文件内容
f = open('a.txt',"w",encoding="utf8")
f.write("这是一个新的文件内容\n") #写入操作 \n回车换行
f.write("这是一个新的文件内容\n") #写入操作
f.writelines(['111\n','222\n']) #列表方式写入多行
print(f.writable()) # 判断是否可写
f.close()
#打开文件,读取文件内容,不写'r',默认是只读模式
r = open("a.txt",'r',encoding="utf8")
data = r.read() #读取全部内容
print(data)
print(r.readable()) #判断文件是否只读
print(r.readline()) #一次读一行内容,下一行内容可以在接着运行readline,默认最后一行内容有个回车,会有换行的情况
print(r.readline(),end="") #去掉最后的回车
print(r.readlines()) #读取所有的内容,把每行的内容放到一个列表中,默认最后一行有空格
r.close()
#追加
f = open('a.txt',"a",encoding="utf8")
f.write("这是追加的内容\n")
f.close()
#r+ 既能读又能写
# f = open('a.txt',"r+",encoding="utf8")
# f.write("这是r+的内容\n") #默认第一行开始写入,把存在的内容直接按顺序覆盖修改
# f.close()
#打开不用关闭文件 用with就可以,自动会关闭文件
with open('a.txt','r',encoding="utf8") as f:
data = f.read()
print(data)
# str ---- > encoding(编码) ----->bytes
# btyes ---> encode(解码) ------->str
#open模式
'''
不填写默认 'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
不填写默认 't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
'''
#b模式就是二进制的方式:
#写
f = open('二进制文件','wb') # wb 二进制方式写入文件,二进制文件没有编码,只有解码
#f.write('1111,你好') #报错 TypeError: a bytes-like object is required, not 'str' 二进制文件写入,需要以二进制的方式,不能直接把str写到里面
#处理方式: 可以先把字符串转换成二进制的方式在写入
#字符串转二进制过程(编码):
test = bytes('1111,你好',encoding="utf-8") #bytes 和 '1111,你好'.encode="utf-8 编码都是一样的;一个是bytes方法 一个是字符串自己提供的一个方法
f.write(test)
#读
f = open('二进制文件','rb') #二进制的方式读取文件
data = f.read()
print(data) #b'1111,\xe4\xbd\xa0\xe5\xa5\xbd'读取的是二进制的文件,所以需要解码成字符串.
#二进制转字符串过程(解码):
print(data.decode('utf-8')) #解码后:1111,你好
'''一: read(3):文件打开方式为文本模式时,代表读取3个字符;文件打开方式为b模式时,代表读取3个字节
其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
'''
f = open('二进制文件','r+',encoding="utf-8")
'''
二进制文件内容如下:
你好
'''
f.readline()
print(f.tell()) #tell光标当前所在位置等于8 为什么是8 因为"你好" 一个中文为3个字节加上win平台的默认回车为"\r\n" 所以为8
f.seek(1) #seek光标跳到第1个字节位置
print(f.tell())
f.truncate(3) #从开始算,将文件安只保留从0-3个字节的内容
#seek 高级模式
f.seek(10,0) #0是默认;不写就是默认0;从文件开始数10个位置
f.seek(10,1) #1相对位置,就是上一次位置,在数10个位置,这个需要b模式打开文件,不然报错
f.seek(-10,2) #2倒序,就是倒着读取,在数-10个位置,这个需要b模式打开文件,不然报错
f.close()
#显示win平台的默认回车;newline以最原始的方式显示换行符
f = open('二进制文件','r+',encoding="utf-8",newline='')
data = f.readlines()
print(data) #['你好\r\n', '1111'] #newline效果就显示\r\n; 不加newline默认情况下是['你好\n', '1111']少一个\r是因为python给你优化掉了