Python文件的操作
文件操作基本流程
文件的操作流程一共分为三步
1、打开文件,得到文件句柄并赋值给一个变量
a = open("abc.txt",mode='r',encoding='gbk')
2、通过文件句柄对文件进行操作
date =a.read()
3、关闭文件
a.close()
关闭文件的注意事项
1、打开一个文件包含两部分资源:操作系统垃圾打开的文件+应用程序的变量。在操作完毕一个文件时,必须把该文件的这两部分资源一个不落的回收:
- close() #回收操作系统级打开的文件
del f #回收应用程序级的变量
2、其中del f 一定要发生在a.close()之后,否则就会导致操作系统打开的文件还没有关闭,占用系统资源
现有txt文件如下,现在我想用Python打开这这txt文件
#爆竹声中一岁除,春风送暖入屠苏。
#千门万户曈曈日,总把新桃换旧符。
a = open("abc.txt",mode='r',encoding='gbk')
date =a.read()
print(date)
a.close()
文件编码
a=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
a = open("abc.txt",mode='r',encoding='gbk')
打开文件的完全列表
模式 |
描述 |
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w |
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ |
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
file对象属性
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:
属性 |
描述 |
file.closed |
返回true如果文件已被关闭,否则返回false。 |
file.mode |
返回被打开文件的访问模式。 |
file.name |
返回文件的名称。 |
file.softspace |
如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
close()方法
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
a = open("abc.txt",mode='r',encoding='gbk')
date =a.read()
print(date)
a.close()
r读取
#方法一、全部读取
a = open("abc.txt",mode='r',encoding='gbk')
date =a.read()
print(date)
a.close()
#方法二、读一部分
a = open("abc.txt",mode='r',encoding='gbk')
date =a.read(5)
print(date)
a.close()
#方法三、按行读取,你每写一行print便读取一行
a = open("abc.txt",mode='r',encoding='gbk')
print(a.readline())
print(a.readline())
print(a.readline())
a.close()
#读取文件放入一个列表
a = open("abc",mode='r',encoding='gbk')
print(a.readlines())
a.close()
#还可以通过for循环进行读取
f1 = open('a.txt', encoding='utf-8')
for line in f1:
print(line)
f1.close()
w和w+
a.write(ABC)
a = open("abc.txt",mode='w',encoding='gbk')
date =a.write("abc123")
a.close()
#打开你的txt文件
#输出结果
abc123
#可以看见他把原来的txt文件内的内容清空了然后再往里面写入
f1 = open("aaa.txt",mode='w+',encoding='gbk')
f1.write("yang,123")
print(f1.read())
f1.close()
#查看aaa.txt文件内容
rb读取及写入
#读取图片
a = open("1.jpg",mode='rb')
print(a.read())
a.close()
#读取1.jpg重新写成2.jpg
f1 = open('1.jpg', mode='rb')
content = f1.read()
f2 = open('2.jpg', mode='wb')
f2.write(content)
f1.close()
f2.close()
a和a+
没有文件,新建文件写入内容,默认如果不加换行符的话他不会自动换行
f1 = open("log.txt",mode='a',encoding='gbk')
f1.write('dsdsdasd')
f1.write('\nyang')
f1.close()
#打开log.txt文件输出内容如下
dsdsdasd
Yang
其他操作方法
#readable 是否可读
#writable 是否可写
#f1.seek(12) # 任意调整
#f1.seek(0,2) #光标调整到最后
#f1.seek(0) #光标调整到开头
#f1.tell() # 告诉光标的位置
#f1.truncate(3) # 按照字节对原文件进行截取 必须在a 或 a+ 模式
f1 = open('log3', encoding='utf-8', mode='a+')
f1.write('python')
print(f1.read())
print(f1.readable())
print(f1.writable())
f1.close()
#返回结果
True
True
f1 = open('log.txt', encoding='utf-8')
f1.read()
print(f1.tell())
print(f1.seek(0))
print(f1.seek(0,2))
f1.seek(12)
f1.seek(0,2)
f1.seek(0)
print(f1.tell())
f1.close()
不用主动关闭文件句柄的方法
with open('log1', encoding='utf-8') as f1,\
open('log2', encoding='utf-8', mode='w') as f2:
content = f1.read()
f2.write(content)
with open('log1', encoding='utf-8') as f1:
print(f1.read())
f1.close()
pass
with open('log1', encoding='utf-8',mode='w') as f2:
f2.write('666')
文件的修改
方法一、将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的
import os # 调用系统模块
with open('a',encoding='utf-8') as read_f,open('.a.txt',mode='w') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡
data=data.replace('爆竹','SB') #在内存中完成修改
write_f.write(data) #一次性写入新文件
os.remove('a') #删除原文件
os.rename('.a.txt','a') #将新建的文件重命名为原文件
方法二、将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os
with open('a') as read_f,open('.a.txt','w') as write_f:
for line in read_f:
line=line.replace('SB','爆竹')
write_f.write(line)
os.remove('a')
os.rename('.a.txt','a')