教学博客地址
打开文件是python的默认内置函数open()的功能,python将其作为内置函数,增加了python函数的易用性.

文件操作的通用步骤及代码

文件操作的逻辑是

  1. 1 打开文件
  2. 2 操作文件
  3. 3 关闭文件

对应代码是:

file = open('filename')
f=file.read()或者类似操作,通过句柄对象来操作文件***
file.close  

打开文件的open函数

open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)
file为字符串的路径和文件名,可以使用相对也可以使用绝对路径
mode 需要详细解释,默认是只读+文本模式.
buffering涉及到如何缓存,以及缓存块的大小,暂时不需要了解.
encoding是读文件解码和写文件的编码采用的模式.注意这个编码不是python内部的编码,而是文件本身的编码.
errors指编码错误时候的一个提示字符串.
newline指的是用什么来控制换行,只在文本模式下生效.如果设置为None,则采用通用模式,\n,\r,\r\n都可以换行,这三个东西都会被转换成\n返回给open函数的结果.如果设置为”,\n \r \r\n不会被转成\n,其他都与设置成None一样.在写入文件的时候,设置成None,则换行符都被转成系统默认的换行符.如果设置成”或者’\n’,则不会进行转换;如果设置成其他字符,则换行符会被替换成该字符.这样做是为了保持平台兼容,windows平台下的换行就是\r\n,但是如果读入的时候保持原样会造成误解.但是\r\n真实存在,在用移动文件指针的方法里,要注意文件末尾一次性移动了两个.
closefd默认为True,如果closefd为False,关闭文件之后,底层文件描述符依然保持打开状态。如果给定文件名则不起作用,在这种情况下必须为True。
open函数执行之后得到一个文件对象(句柄),可以赋给一个变量之后操作.

对文件的操作

文件对象的方法:
file.read()一次性读出全部文件内容,如果是文本模式,返回的是一个字符串对象.如果是二进制文件,返回一个bytes对象.如果对read(进行)遍历操作拿东西的话,file的文件指针根据操作改变位置.可以加数值参数,表示读出N个字符.
file.readable() 判断对象是否可读,比如用只写模式打开,结果就是False
file.readline()一次读出一行的内容,包括行尾的换行符.并且文件指针移动到下一行的开始,再次执行该函数的时候,返回下一行.
file.readlines()将全部的行读出,每一行组成一个列表返回.

file.writeable()是否可写
file.write()将内容写进文件,参数是字符串.返回写了几个字符.
file.writelines(),参数传一个包含各个字符串元素的列表,会将每一个元素写进去.

关闭文件

在完成操作之后,需要关闭两个东西,一是关闭从操作系统拿到的文件句柄,二是关闭赋给文件对象的变量.
python一般会自动操作第二项,所以一定要采取 file.close()通知操作系统关闭.
如果觉得手动关闭比较麻烦,可以用with进行上下文管理,其他语句作为with代码块的内容.with可以同时打开两个文件,

with open('a.txt','w') as f1,open('b.txt','r') as f2:
    f1.read()
    f2.read()
    ...

打开文件的模式

r 只读,打开的时候不修改文件内容,也无法保存文件.可以采用read系列方法
w 只写,不可读.w模式在打开的时候,如果存在同名文件,会将文件清空,如果不存在,则会新建一个文件.可以采用write系列方法
a 追加模式.能够写,写的内容追加在文件的末尾.a模式下不可读
r+ 在r功能的基础上可以读写.r+打开文件的时候指针放在开始的位置.
w+ 先覆盖原文件的功能不变,可读可写
a+ 可读可写,打开的时候文件指针在文件末尾.
b 用于打开二进制文件=文本文件以外的文件,都需要用到字节模式,字节模式可以和基本模式组合使用,如rb,wb,ab

字节模式的文件操作

之前操作的是文本文件.文本文件之外的文件,都需要用字节模式.与操作文本文件没有什么不同,写的时候要注意必须写入字节类型的数据.
需要采用内置函数 bytes(内容,编码)来将内容换成某种编码的字节文件.或者用字符串的.decode或者.encode方法.如果需要编写跨平台的程序,则一般用字节模式,因为不同操作系统,底层都是二进制模式.如果依赖系统编码,则可能出现各种问题.
二进制–>字符串 解码
字符串–>二进制 编码
还记得编码一书吗?

文件的其他方法

打开文件不找到是什么编码的时候 ,可以尝试把编码指定为latin-1,会尽可能多的保留字符.

file.closed() 文件是否已经关闭
file.flush() 将内存的数据刷到硬盘里
file.name 文件名,是一个属性,不是方法
file.seek(int,mode = 0) 三种模式:移动到指定的文件指针处,这里的int是索引.0模式表示文件的第一个字节索引为0,int为几就移动到对应的索引处.1模式表示相对上一次位置,需要以b模式打开文件.2模式表示从文件末尾开始seek,这时候int应该为负数.
file.tell() 返回文件指针的位置,这里的指针统计是按照字节来的.windows系统内的换行符其实是\r\n,算两个字节.
file.truncate(int) 截取文件,属于写操作.保留指定字节长度的内容.这里的int不是索引,就是普通的长度.

seek tell 方法可以用来移动文件指针进行操作.
小TIP: for i in file: 这样比for i in file.readlines()要好,不用先把所有行读入到内存里,前者像生成器一样,要一次才给一次.
文件处理是以后写实用程序经常用到的东西,需要反复练习.