Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode=‘r‘)完整的语法格式为:
open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)参数说明:
\r\n 转换为 \n)。mode 参数
| 模式 | 描述 | 
|---|---|
| t | 文本模式 (默认)。 | 
| x | 写模式,新建一个文件,如果该文件已存在则会报错。 | 
| b | 二进制模式。 | 
| + | 打开一个文件进行更新(可读可写)。 | 
| U | 通用换行模式(不推荐)。 | 
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 | 
| rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 | 
| r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 | 
| rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 | 
| w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 | 
| wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 | 
| w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 | 
| wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 | 
| a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 | 
| ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 | 
| a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 | 
| ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 | 
默认为文本模式,如果要以二进制模式打开,加上 b 。

| 模式 | r | r+ | w | w+ | a | a+ | 
|---|---|---|---|---|---|---|
| 读 | + | + | + | + | ||
| 写 | + | + | + | + | + | |
| 创建 | + | + | + | + | ||
| 覆盖 | + | + | ||||
| 指针在开始 | + | + | + | + | ||
| 指针在结尾 | + | + | 
只要不是 read() 方法,其余的方法移动光标都是按字节计算。read() 方法按照字符计算。seek() 按字节调整光标,若要使用 seek() 其他模式(默认从头开始),使用二进制模式读入文件。
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
| 序号 | 方法及描述 | 描述 | 
|---|---|---|
| 1 | file.close() | 关闭文件。关闭后文件不能再进行读写操作。 | 
| 2 | file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 | 
| 3 | file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 | 
| 4 | file.isatty() | 如果文件连接到一个终端设备返回 True,否则返回 False。 | 
| 5 | file.next() | 返回文件下一行。 | 
| 6 | file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 | 
| 7 | file.readline([size]) | 读取整行,包括 "\n" 字符。 | 
| 8 | file.readlines([sizeint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 | 
| 9 | file.seek(offset[, whence]) | 设置文件当前位置。offset:开始的偏移量,也就是代表需要移动偏移的字节数。whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。 | 
| 10 | file.tell() | 返回文件当前位置,即文件指针当前位置。 | 
| 11 | file.truncate([size])] | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 | 
| 12 | file.write(str) | 将字符串写入文件,返回的是写入的字符长度。 | 
| 13 | file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 | 
文件对象属性
| 编号 | 属性 | 描述 | 
|---|---|---|
| 1 | file.closed | 如果文件关闭则返回 true,否则返回false。 | 
| 2 | file.mode | 返回打开文件的访问模式。 | 
| 3 | file.name | 返回文件的名称。 | 
获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
如果不用with语句,代码如下:
file = open("/tmp/foo.txt")
data = file.read()
file.close()这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:
file = open("/tmp/foo.txt")
try:
    data = file.read()
finally:
    file.close()虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:
with open("/tmp/foo.txt") as file:
    data = file.read()这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
class Sample:
    def __enter__(self):
        print("In __enter__()")
        return "Foo"
 
    def __exit__(self, type, value, trace):
        print("In __exit__()")
 
def get_sample():
    return Sample()
 
with get_sample() as sample:
    print("sample:", sample)
    
# 结果
In __enter__()
sample: Foo
In __exit__()with真正强大之处是它可以处理异常。可能你已经注意到Sample类的__exit__方法有三个参数- val, type 和 trace。 这些参数在异常处理中相当有用。实际上,在with后面的代码块抛出任何异常时,exit()方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在__exit__方法当中。
with语句打开和关闭文件,包括抛出一个内部块异常。for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,防止内存溢出。
#If the file is line based
with open(...) as f:
  for line in f:
    process(line) # <do something with line>原文:https://www.cnblogs.com/arelive/p/python-24.html