Python的文件操作

Posted 吃了好多肉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的文件操作相关的知识,希望对你有一定的参考价值。

假如利用Python代码写一个很low的软件,去操作文件:
  • 需要的参数:

    • 文件路径:path
    • 打开方式:读,写,追加,读写,写读。。。
    • 编码:utf-8,gbk,Unicode,big5。。。
    例:    
    f1 = open(‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘,)
    content = f1.read()
    print(content)
    f1.close()
    
  • open():内置函数,open底层调用的是操作系统的接口

  • f1:变量名,例:fh,file_header,f_h,文件句柄,对文件进行的任何操作,都得通过文件句柄

  • encoding:可以不写,不写则默认为系统的默认编码

    • Windows:默认为gbk
    • Linux:utf-8
    • Mac:utf-8
  • mode:定义操作方式,r为读模式

  • f1.close():关闭文件句柄,若不关闭会一直占用内存空间

文件操作三部曲:

  • 1、打开文件
  • 2、对文件句柄进行相应操作
  • 3、关闭文件
# 常见报错原因:
UnicodeDecodeError
# 文件存储时与文件打开是编码类型不一致
No such file or directory
# 文件路径或文件名错误。路径分隔符被解释器误认为特殊含义的字符,可以再次转义,或在路径整体前面加上r

文件操作的读:

  • r:读,rb:读取非文本文件,r+:读写,r+b:以bytes类型读写
read():读取文件全部

read(n):按照字符串读取

readline():每次只读取一行,读取出来的每行后面都有一个换行符
,可以在读取的后面加一个strip()

readlines():返回一个列表,列表里的元素是源文件的每一行,如果文件很大,会占大量内存

# for循环读取:(推荐)
# 文件句柄是一个迭代器,特点就是每次循环只在内存中占一行数据,非常节省内存
# 例:
f1 = open(‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘)
for content in f1:
    print(content)
f1.close()
  • rb模式:以二进制格式打开一个文件用于只读。主要操作非文本文件,

    • 带b的模式操作文件,不用声明编码方式。读取后的文件类型为bytes类型

      # 例:
              fi = open(r‘source‘,mode=‘rb‘)
              coutent = fi.read()
              print(coutent)
              fi.close()
      

文件操作的写:

  • w:(写)wb:(操作非文本文件),w+:(写读),w+b:(以bytes类型进行写读)
  • 文件不存在则新建,文件存在则先清空源文件内容,再写入新内容
f = open(‘文件的路径‘,encoding=‘utf-8‘,mode=‘w‘) 
# 未指定路径则为当前路径
f.write(‘写入的内容,只能有这一个参数‘)
f.close()  

  • wb:

    # 例:先以bytes类型读取图片,再将读取出来的内容全部写入另一个文件,这样就复制了一份图片
    fi = open(r‘source‘,mode=‘rb‘)
    coutent = fi.read()
    fi.close()
    
    f1 = open(‘new‘,mode=‘wb‘)
    f1.write(coutent)
    f1.close()
    

文件操作的追加:

  • a,ab,a+:追加并可读,a+b

  • 没有文件则创建文件,追加内容。文件存在则原文件最后直接追加。

    f = open(‘fiel‘,encoding=‘utf-8‘,mode=‘a‘)
    f.write(‘追加的内容‘)
    f.close()

文件操作的其他模式:

  • r+:读并追加
# 例:
    f = open(‘F:测试.txt‘,mode=‘r+‘,encoding=‘utf-8‘)
    content = f.read()
    print(content)
    f.write(‘写入的内容‘)
    f.close()

# 注意:操作文件时,要注意光标位置,例如写读操作,写操作完光标会在末尾,所以无法读出写入的内容
    可在read()之前,利用seek(0)将光标移动到首部。

文件操作其他功能:

  • 总结:

    • 三个大方向,四种模式:

      • 读:r,rb,r+,r+b

      • 写:w,wb,w+,w+b

      • 追加:a,ab,a+,a+b

  • 相应的功能:

    • read(n):

      • 1、文件打开为文本模式时,代表读取n个字符
      • 2、文件打开为b模式时,代表读取n个字节
    • seek():

      • seek(n):光标移到n位置,移动单位是字节byte,如果是utf-8编码,中文部分需要是3的倍数
      • seek(0):移动到开头
      • seek(0,2):seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1代表当前位置,2表示结尾
    • tell():

      • 获取当前光标的位置,单位是字节。
    • flush():强制刷新。接在write()后面,可在写入之后强制保存。

?

打开文件的另一种方式:

  • 语句 with open() as f:

    • 优点1:不用手动关闭,with上下文管理会在一段时间后自动关闭文件句柄。

      with open(r‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘) as f1:
      	print(f1.read())
      
  • 优点2:一个with语句可以操作多个文件,产生多个文件句柄。

with open(r‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘) as f1,    open(‘filename‘,mode=‘w‘,encoding=‘utf-8‘) as f2 : 
    f1.read()
    f2.write(‘content‘)

?

  • 注意:with打开文件在一段时间后会自动关闭句柄,但这个时间不固定。
  • 如果你在with语句中以r模式打开f1文件,那么你在下面又以a模式打开f1文件,此时有可能你第二次打开f1文件时,第一次的文件句柄还没有关闭,可能会出现错误。
  • 解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。

文件的修改:

  • 所有的软件对文件的修改都分为5步:

    • 1、以读的模式打开文件。

    • 2、以写的模式创建一个新的文件。

    • 3、将原文件的内容读出来修改成新的内容、写入新文件。

    • 4、将原文件在内存级别删除。

    • 5、将新文件重命名成原文件。

  • 方式一:

  • 1、以读的模式打开文件。

with open(r‘F:	1.txt‘,encoding=‘utf-8‘) as f1,     open(r‘F:	2.txt‘,encoding=‘utf-8‘,mode=‘w‘) as f2: # 2、以写的模式创建一个新文件
  • 3、将原文件内容全部读出到内存修改成新内容、写入新文件。(占用大量内存空间)

?

old_content = f1.read()
new_content = old_content.replace(‘葫芦‘,‘丝瓜‘)
f2.write(new_content)
  • 4、将原文件在内存级别删除。
import os  # 需要用到 os 模块

 os.remove(r‘F:	1.txt‘)
  • 5、将新文件重命名成原文件。
os.rename(r‘F:	2.txt‘,r‘F:	1.txt‘)
  • 方式二

  • 1、以读的模式打开文件。

with open(r‘F:	1.txt‘,encoding=‘utf-8‘) as f1,    open(r‘F:	2.txt‘,encoding=‘utf-8‘,mode=‘w‘) as f2:    # 2、以写的模式创建一个新文件
  • 3、将原文件内容逐行读到内存修改成新内容、写入新文件。(占用大量硬盘空间)
 for line in f1:
        new_line = line.replace(‘丝瓜‘,‘葫芦‘)
        f2.write(new_line)

4、将原文件在内存级别删除。

import os
os.remove(r‘F:	1.txt‘)

5、将新文件重命名成原文件。

os.rename(r‘F:	2.txt‘,r‘F:	1.txt‘)
注意:w模式中,文件句柄若没有关闭,可以多次写入而不会清空上一次写入的内容。

?



以上是关于Python的文件操作的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

常用python日期日志获取内容循环的代码片段

使用 Python 代码片段编写 LaTeX 文档

VSCode 如何操作用户自定义代码片段(快捷键)

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程