详解Python中的文件操作

了解过字符编码都知道,文件都是以某一种标准编码成二进制存在硬盘里的,在文件的默认打开模式下f = open(\’a.txt\’,\’rt\’,encoding=\’utf-8\’) 其中的t表示是以文本模式打开文件,在应用程序给操作系统发送数据请求后,操作系统在硬盘读取二进制编码,然后返还给应用程序,通过open方法,将编码解码成我们看到的字符;如果是以b模式打开文件的话,open方法不会对操作系统返回的二进制数据作处理,而是直接打印。

f = open(\'a.txt\',\'rt\',encoding=\'utf-8\') 

其中的t表示是以文本模式打开文件,在应用程序给操作系统发送数据请求后,操作系统在硬盘读取二进制编码,然后返还给应用程序,通过open方法,将编码解码成我们看到的字符,那么在b模式下打开文件,操作系统返还直接是一串二进制数字 文件的三种打开方式: 只读模式:‘r\’ 只写方式:\’w\’ 追加模式:\’a\’ 以字节模式打开文件的话,需要注意: 一定要写上‘b\’,只能以rb,wb,ab这种形式打开文件,不能省略‘b\’。

f = open(\'a.txt\',\'rb\')  
f = open(\'a.txt\',\'wb\') 
f = open(\'a.txt\',\'ab\') 
#错误写法
f = open(\'a.txt\',\'r\') #未注明以b模式打开,这种写法是默认文本模式打开 
f = open(\'a.txt\',\'rb\',encode = \'utf-8\') #b模式打开,不能传入编码方式

字节模式下读写都是以bytes为单位的。如果想写入字符,需要编码后以字节类型写入

f = open(\'a.txt\',\'wb\')
f.write(\'你哈\'.encode(\'utf-8\'))

注意:对于非文本文件,我们只能使用字节模式,\”b\”表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)

二:字节模式下的操作

字节模式打开非文本文件

with open(\'1.jpg\', \'rb\') as f: # 以只读模式打开文件
  data = f.read()       # 读取文件全部内容,并赋值给变量data
print(data)           # 打印变量,我们得到是b\'\\xff\\xd8\\xff\\xe0\\x00这种形式的结果
print(type(data))        # 变量的类型<class \'bytes\'>

with open(\'1.jpg\',\'rb\') as f:
    data = f.read()
print(type(data))
print(data.decode(\'utf-8\'))   #将读取的编码以utf-8标准解码
                 #图片文件编码方式不是utf-8,所以不能解码,程序报错

以字节模式打开文本文件:

在以字节打开文件时,文件的操作都要基于二进制进行了.

三:文件的修改  

文件的修改并不是我们直观感受上的擦除重新写上,基于硬盘的特性,任何文件的修改操作都是新内容对原内容的覆盖。修改的概念存在于内存中,当应用程序启动,请求操作系统从硬盘中读取数据,读取的数据运行在内存上,这时,我们在应用程序上的操作修改类内存上的数据内容,但是并不影响到硬盘的数据。当我们点击保存时,新的数据会将原数据覆盖。这时,才完成了文件的修改。

修改文件方式一:

  1. 先把文件内容全部读取
  2. 在内存中修改
  3. 把修改好的内容覆盖写入到硬盘上
with open(\"db.txt\", \"r\", encoding=\"utf-8\") as f:  # 打开文件
  data = f.read()                # 读取文件全部内容
  data = data.replace(\"你好啊:\", \"======\")    # 修改文件内容
  
with open(\"db.txt\", \"w\", encoding=\"utf-8\") as f:  # 以‘w\'模式打开,清空文件
  f.write(data)                 # 把修改后的数据写入

修改文件方式二:

  1. 以读的方式打开源文件
  2. 以写的方式打开一个新文件
import os # 引入os模块

with open(\'a.txt\', \'r\', encoding=\'utf-8\') as read_f, \\
    open(\'new.txt\', \'w\', encoding=\'utf-8\') as new_f: # 同时打开文件
  for line in read_f:                  # 循环原文件内容
    if \'你好啊\' in line:
      line = line.replace(\'你好啊\', \'哈哈哈哈哈哈\') # 替换源文件内容
    new_f.write(line)                # 把原文件循环出来的内容写入到新文件中,
    
os.remove(\'a.txt\')                   # 调用OS模块功能删除原文件
os.rename(\'new.txt\', \'a.txt\')              # 重命名新文件
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容