*Python3的默认编码是utf8,而其中的open函数打开文件时依托于系统编码(windows编码时gbk)
这里面比较经典的问题就是解码与编码的码不一致,导致乱码的问题
*文件操作的基本流程:
1.f=open("文件路径",encoding="编码") 注意:文件的编码要与打开文件时的解码一致
2.data=f.read()
3.print(data)
4.f.close()
*文件的操作模式:
注意:读写的文件内容必须都是字符串。write或是read参数都是字符串,writelines或是readlines参数都是list
1.r:只读 open()函数默认就是只读的。 (r+ 读写都可以)
读文件:
f=open("文件路径",‘r’,encoding="编码")
f.readable() 如果对象是只读的,则返回True,否则返回False
f.readline() 按行读取文件中的数据。
例:f=open("b.txt")
data1=f.readline()
data2=f.readline()
print(data1,end="") #如果不加end,默认打印数据之间是有换行符的。
print(data2)
注意:如果使用f.read()读取文件的全部内容了,这是光标会自动到文件内容的末尾,所以在使用
f.readline()就不会在读取出数据了。
f.readlines():读取多行,默认返回列表,每一行数据包括换行符作为列表中的一个元素
2.w:只写(w+读写都可以)
写文件:
f=open("文件路径",‘w’,encoding="编"码):如果文件不存在,则创建一个空的文件;如果存在,则清空原文件内容
f.write("文件内容\n") 如果不手动添加换行符,默认是不会换行的
f.writeable():如果对象是只写的,则返回True,否则返回False
f.writelines(list):写多行,列表中元素的个数代表写几行内容,前提是每个元素里面结尾必须加上换行符
3.a:只追加(写)[a+ 可读写]
f=open("文件路径",‘a’,encoding="编"码):如果文件不存在,则创建一个空的文件;如果存在,则保留原文件内容
f.write()/f.writelines()会把数据追加到文件中数据末尾
4.with open(...) as f:
...
本方法操作文件不需要手动调用close方法,其本身会自动调用,这就是这个方式操作文件的优势
with open() as f1,open() as f2:
...
打开多个文件
这里面比较经典的问题就是解码与编码的码不一致,导致乱码的问题
*文件操作的基本流程:
1.f=open("文件路径",encoding="编码") 注意:文件的编码要与打开文件时的解码一致
2.data=f.read()
3.print(data)
4.f.close()
*文件的操作模式:
注意:读写的文件内容必须都是字符串。write或是read参数都是字符串,writelines或是readlines参数都是list
1.r:只读 open()函数默认就是只读的。 (r+ 读写都可以)
读文件:
f=open("文件路径",‘r’,encoding="编码")
f.readable() 如果对象是只读的,则返回True,否则返回False
f.readline() 按行读取文件中的数据。
例:f=open("b.txt")
data1=f.readline()
data2=f.readline()
print(data1,end="") #如果不加end,默认打印数据之间是有换行符的。
print(data2)
注意:如果使用f.read()读取文件的全部内容了,这是光标会自动到文件内容的末尾,所以在使用
f.readline()就不会在读取出数据了。
f.readlines():读取多行,默认返回列表,每一行数据包括换行符作为列表中的一个元素
2.w:只写(w+读写都可以)
写文件:
f=open("文件路径",‘w’,encoding="编"码):如果文件不存在,则创建一个空的文件;如果存在,则清空原文件内容
f.write("文件内容\n") 如果不手动添加换行符,默认是不会换行的
f.writeable():如果对象是只写的,则返回True,否则返回False
f.writelines(list):写多行,列表中元素的个数代表写几行内容,前提是每个元素里面结尾必须加上换行符
3.a:只追加(写)[a+ 可读写]
f=open("文件路径",‘a’,encoding="编"码):如果文件不存在,则创建一个空的文件;如果存在,则保留原文件内容
f.write()/f.writelines()会把数据追加到文件中数据末尾
4.with open(...) as f:
...
本方法操作文件不需要手动调用close方法,其本身会自动调用,这就是这个方式操作文件的优势
with open() as f1,open() as f2:
...
打开多个文件
5.注意:把文件中的内容存到硬盘上,即实现str编码成byte的形式,从硬盘上读取str,即实现byte解码成str的操作
*b是操作字节文件
.rb模式
f=open(file,'rb') 注意:这里面是从硬盘上直接读取字节文件,不需要编码,即没有encoding这个参数
print(f.read()) :打印的内容都是字节对象(包括\r\n换行符),如果想打印字符串即原文件具体内容,可以data.decode()
注意:解码与编码的码一致
. wb模式
f=open(file,'wb')
方式一:f.write(bytes(filecontent,encoding)) 注意:必须指定编码encoding,因为文件存到硬盘上,必须编码(str-->byte)
方式二:f.write(str.encode(编码))
.ab模式
注意:为什么使用b模式?
*b模式可以打开多种类型文件(文件默认打开的是文本类型,即便你指定‘r’的方式打开文件,其默认也会变成‘rt’,
w与a同上;如果操作非文本类型就要使用b模式)
*b模式跨平台
*b模式对于linux操作系统没用。因为linux默认打开文件就是b模式的
*b是操作字节文件
.rb模式
f=open(file,'rb') 注意:这里面是从硬盘上直接读取字节文件,不需要编码,即没有encoding这个参数
print(f.read()) :打印的内容都是字节对象(包括\r\n换行符),如果想打印字符串即原文件具体内容,可以data.decode()
注意:解码与编码的码一致
. wb模式
f=open(file,'wb')
方式一:f.write(bytes(filecontent,encoding)) 注意:必须指定编码encoding,因为文件存到硬盘上,必须编码(str-->byte)
方式二:f.write(str.encode(编码))
.ab模式
注意:为什么使用b模式?
*b模式可以打开多种类型文件(文件默认打开的是文本类型,即便你指定‘r’的方式打开文件,其默认也会变成‘rt’,
w与a同上;如果操作非文本类型就要使用b模式)
*b模式跨平台
*b模式对于linux操作系统没用。因为linux默认打开文件就是b模式的
6.文件操作的其他方法:
* f=open(file,'r',encoding='gbk')
print(f.encoding)#该方法获取的是encoding的参数值(文件的解码的码值,并非文件编码码值)
* f=open(file,'w',encoding='gbk')
f.write("I love China!")
f.flush()
PyCharm中,会默认调用该方法,把内容写到文件中,在cmd中,需要手动调用flush()方法
*f.tell():返回值是光标所在的位置(光标移动是以字节为单位的)
注意:windows下的换行符是\r\n,不同系统的换行符在PyCharm中都会被转换成\n,但是只是形式发生变化,其字节数并未变
还要注意文件编码的中文问题,中文在utf8中占用3个字节,gbk中占用2个字节
例:f=open("a.txt","r+",encoding="utf-8",newline='')
print(f.readlines())
如果open函数不加newlines参数,打印的内容是['...\n','...\n',...],加上参数之后,打印内容是['...\r\n',...]
*f.seek(int):从文件头开始移动光标到int的位置(字节)
1.f=open(file,'r+',encoding='gbk')
f.seek(int,0):第二个参数是0,是该方法的默认值,即从文件头开始移动光标
2.f=open(file,'rb+')
f.seek(int,1):第二个参数是1,表示从相对位置移动光标,所谓的相对位置即上一次seek的位置
3.f=open(file,'rb+')
f.seek(int,2):从文件内容的末尾倒着读int个字符,注意int必须是负数才可以,若是正数不报错,但是处理不多。
注意:seek方法除了默认的模式0之外,其他的文件打开方式必须是b模式,否则报错
*f.read(int):从光标位置读取int个字符
*f.truncate(int):从文件头发开始截取文件内容(字节为单位,注意中文问题)
*循环文件:
方式一:
f=open(file,'rb')
for item in f.readlines():浪费内存,因为文件中的内容已经全部读取出来放到list中了
print(i)
方式二:
f=open(file,'rb')
for item in f:按行读取文件内容,只是在需要的时候才会读取,不会以一下子全部拿出来
offs=10 #偏移量
while True:
f.seek(offs,2)
li=f.readlines()
if len(li)>1 :
print(data[-1].decode('utf-8'))#这里面的解码与你该文件的编码一致,不一定是utf-8
break;
offs*=2
方式二是读取大型文件的最后一行操作。常见于面试题
* f=open(file,'r',encoding='gbk')
print(f.encoding)#该方法获取的是encoding的参数值(文件的解码的码值,并非文件编码码值)
* f=open(file,'w',encoding='gbk')
f.write("I love China!")
f.flush()
PyCharm中,会默认调用该方法,把内容写到文件中,在cmd中,需要手动调用flush()方法
*f.tell():返回值是光标所在的位置(光标移动是以字节为单位的)
注意:windows下的换行符是\r\n,不同系统的换行符在PyCharm中都会被转换成\n,但是只是形式发生变化,其字节数并未变
还要注意文件编码的中文问题,中文在utf8中占用3个字节,gbk中占用2个字节
例:f=open("a.txt","r+",encoding="utf-8",newline='')
print(f.readlines())
如果open函数不加newlines参数,打印的内容是['...\n','...\n',...],加上参数之后,打印内容是['...\r\n',...]
*f.seek(int):从文件头开始移动光标到int的位置(字节)
1.f=open(file,'r+',encoding='gbk')
f.seek(int,0):第二个参数是0,是该方法的默认值,即从文件头开始移动光标
2.f=open(file,'rb+')
f.seek(int,1):第二个参数是1,表示从相对位置移动光标,所谓的相对位置即上一次seek的位置
3.f=open(file,'rb+')
f.seek(int,2):从文件内容的末尾倒着读int个字符,注意int必须是负数才可以,若是正数不报错,但是处理不多。
注意:seek方法除了默认的模式0之外,其他的文件打开方式必须是b模式,否则报错
*f.read(int):从光标位置读取int个字符
*f.truncate(int):从文件头发开始截取文件内容(字节为单位,注意中文问题)
*循环文件:
方式一:
f=open(file,'rb')
for item in f.readlines():浪费内存,因为文件中的内容已经全部读取出来放到list中了
print(i)
方式二:
f=open(file,'rb')
for item in f:按行读取文件内容,只是在需要的时候才会读取,不会以一下子全部拿出来
offs=10 #偏移量
while True:
f.seek(offs,2)
li=f.readlines()
if len(li)>1 :
print(data[-1].decode('utf-8'))#这里面的解码与你该文件的编码一致,不一定是utf-8
break;
offs*=2
方式二是读取大型文件的最后一行操作。常见于面试题