一、大致介绍

  我们在计算机上进行的操作,归根结底是对文件的操作,其实质是由操作系统发送请求,将用户或者应用程序对文件读写操作转换成具体的硬盘指令。

  众所周知,内存中的数据是无法永久保存的。在计算机硬件中,能长期保存数据的只有计算机硬盘。因此,对文件的操作的实质是对硬盘的操作。

  以下,我们将探讨如何用python实现对文件的具体操作。


二、具体操作流程

 首先,对文件的操作步骤简略的可以分为三个步骤:

  ① 打开文件并将其赋值给一个变量,类似c语言内的文件指针。

  ② 通过对变量的操作实现对内存中的数据的增删改。

  ③关闭文件。

文件打开

语法:

open(file, mode='r')   
#简略的
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
#完整的

参数说明:

  • file: 必需,文件路径(相对或者绝对路径)
  • mode: 可选,文件打开模式
  • buffering: 设置缓冲
  • encoding: 一般使用utf8,默认的是系统的编码模式,不是编译器的
  • errors: 报错级别
  • newline: 区分换行符
  • closefd: 传入的file参数类型

mode参数对应表

t   文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(Python 3 不支持)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

相关注意点:

1. 打开文件的模式有(默认为文本模式):

  r ,只读模式             #【默认模式,文件必须存在,不存在则抛出异常】

  w,只写模式             #【不可读;不存在则创建;存在则清空内容】

  a, 之追加写模式      #【不可读;不存在则创建;存在则只追加内容】

2. 对于非文本文件,我们只能使用b模式(打开时不用指定encoding)

  "b"表示以字节的方式操作,而所有文件也都是以字节的形式存储的

   使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式

   以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

3. 在Windows环境下,python的换行符为 \r\n   ,在Linux下换行符为   \n

 为了统一起见,显示的是 \n  ,若要显示  原样,可以在打开文件时在open()函数中指定  newline = ' '


文件操作

方法1:f.flush()        作用:来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区

方法2:f.readable()                       作用:判断文件是否可读

方法3:f.writable()                         作用:判断文件是否可读

方法4:f.read()                             作用 :从文件读取指定的字节数,如果为给定或为负则读取所有

方法5:f.readline()        作用:从文件读取整行,包括\n,光标移动到第二行首部;如果指定了一个非负参数,则返回指定大小的字节数

方法6:f.readlines()              作用:从文件读取所有行(直到结束符EOF),并返回一个相应的列表

方法7:f.write()        作用:向文件写入指定的字符串,在文件关闭前或缓冲区刷新前无法在文件中看到相关内容

                  针对文本文件,需要自己写换行符;在向二进制文件中写数据时,需要指定编码方式

                  如:  f.write('1111\n222\n'.encode('utf-8'))

方法8:f.writelines()      作用:向文件中写入可迭代对象,在二进制文件中写数据时,需要指定编码方式

                  如:  f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')])

方法9:f.truncate()       作用:从文件的首行首字节开始截断,截断文件为 size 个字节,文件的打开形式必须是可写;

                    截断之后 V 后面的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小。

 语法:                                          参数:size,截断文件为 size 字节

fileObject.truncate( [ size ])


光标移动

seek() 方法用于移动文件读取指针到指定位置。

tell() 方法用于明确当前光标位置

语法:

fileObject.seek(offset[, whence])

参数:

  • offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。

  • whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;

        0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。

返回值:

  如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。

实例:

>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # 移动到文件的第六个字节
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # 移动到文件倒数第三个字节
13
>>> f.read(1)
b'd'


注意:

一、 打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。

在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
     f.close() #回收操作系统级打开的文件

二、 f=open(...)是由操作系统打开文件,如果没有为open指定编码,那么打开文件的默认编码由系统决定,
    
   操作系统会用自己的默认编码去打开文件,在windows下是 gbk,在Linux下是utf-8。

最新文章

  1. vim 中替换
  2. jQuery图片滚动插件
  3. android native crash 分析
  4. db2命令
  5. UNITY 状态机 + SVN + 码云 下篇
  6. 关于CGContextSetBlendMode: invalid context 0x0的错误
  7. Mysql log_slave_updates 参数
  8. unity button
  9. Quartz.net 2.0的使用说明
  10. Oracle_Flashback_技术_总结
  11. div与span
  12. 健康管理app要注意哪些要点
  13. Wap touch flispan demo
  14. 精通CSS+DIV网页样式与布局--页面和浏览器元素
  15. Vue对变量的监控
  16. C#相关FTP操作
  17. git拉取远程分支到本地
  18. 【Zookeeper系列】ZooKeeper安装配置(转)
  19. hot-warm-architecture-in-elasticsearch-5-x
  20. e797. 显示JSlider的标记

热门文章

  1. javascript——function类型(this关键字)
  2. centos 7下设置.net core项目开机自启动
  3. Revit二次开发环境配置(Revit 2020 +Visual Studio 2019)
  4. ajax和comet
  5. Redis内存管理中的LRU算法
  6. HDU 4746 Mophues(莫比乌斯反演)题解
  7. Set DSL in Ubuntu 18.04
  8. 知乎 bug
  9. Promise.allSettled & Promise.all & Promise.race & Promise.any All In One
  10. MDN Browser Compatibility Report 2020