文件操作基本流程

文件的操作流程一共分为三步

1、打开文件,得到文件句柄并赋值给一个变量

a = open("abc.txt",mode='r',encoding='gbk')

2、通过文件句柄对文件进行操作

date =a.read()

3、关闭文件

a.close()

关闭文件的注意事项

1、打开一个文件包含两部分资源:操作系统垃圾打开的文件+应用程序的变量。在操作完毕一个文件时,必须把该文件的这两部分资源一个不落的回收:

  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')

作者:杨灏