使用 read()、readline() 或者 readlines() 读取文本文件
你可以按照下面的示例那样,使用不带参数的 read() 函数一次读入文件的所有内容。但在读入文件时要格外注意,1GB的文件会用到相同大小的内存。
同样也可以设置最大的读入字符数限制 read() 函数一次返回的大小。下面一次读入10个字符,然后把每一快拼接成原来的字符串 poem
读到结尾之后,再次调用 read() 会返回空字符串(‘’), if not fragment 条件被判断为 False。此时会跳出 while True 的循环。 当然, 你也能使用 readline() 每次读入文件的一行。 在下面的例子中,通过追加每一行拼接成原来的字符串 poem:对于一个文本文件,即使空行也有1字符长度(换行符’\n’),自然会返回 True。当文件读取结束后,readline() (类似 read() ) 同样会返回空字符串,也被 while True 判断为 False。
读取文本文件最简单的方式是使用一个迭代器(iterator),它会每次返回一行。这和之前的例子类似,但代码会更短:
使用 write() 写二进制文件
如果文件模式字符串中包含 ‘b’, 那么文件会以二进制模式打开,这种情况下,读写的是字节而不是字符串。
我们手边没有二进制格式的诗,所以直接在 0~255 产生 256 字节的值:
以二进制模式打开文件,并且一次写入所有的数据:
再次,write() 返回到写入的字节数。
对于文本,也可以分块写二进制数据:
使用 read() 读取二进制文件
使用 with 自动关闭文件
如果你忘记关闭已经打开的一个文件,在该文件对象不再被引用之后 Python 会关掉此文件。这也意味着在一个函数中打开文件,并没有及时关闭它,但是在函数结束时会被关掉。然而你可能会在一直运行中的函数或者程序的主要部分打开一个文件,应该强制剩下的所有写操作完成后再关闭文件。
Python的上下文管理器(context manager)会清理一些资源,例如打开的文件。它的形式为
:
完成上下文管理器的代码后,文件会自动关闭。
使用 seek() 改变位置
无论是读或者写文件,Python都会跟踪文件中的位置。函数 tell() 返回距离文件开始处的字节偏移量。函数 seek() 允许跳转到文件其他字节偏移量的位置。这意味着可以不用从头读取文件的没一个字节,直接跳转到最后位置并制度一个字节也是可行的。
对于这个例子,使用之前写过的 256 字节的二进制文件 ‘bfile’:
使用 seek() 读取文件结束前最后一个字节:
一直读到文件结束:seek() 同样返回当前的偏移量。
用第二个参数调用函数 seek():seek(offset, origin)
如果 origin 等于0 (默认为0),从头偏移 offset 个字节;
如果 origin 等于1,从当前位置处偏移 offset 个字节;
如果 origin 等于2,距离最后结尾处偏移 offset 个字节。
这些值也在标准库 os 模块中被定义:
所以,我们可以用不通的方法读取最后一个字节:
文件结尾前的一个字节:
一直读到文件结尾:
在调用 seek() 函数时不需要额外调用 tell()。前面的例子只是想说明两个函数都可以返回同样的偏移量。
下面是从文件的当前位置寻找:
接下来的例子返回最后两个字节:
在此基础上前进一个字节:
这些函数对于二进制文件都是极其重要的。当文件是 ASCII 编码(每个字符一个字节)时,也可以使用它们,但是计算偏移量会是一个麻烦事。其实,这些都取决于文件的编码格式,最流行的编码格式(例如 UTF-8)每个字符的字节数都不尽相同。
下期 我们说“异常”
领取专属 10元无门槛券
私享最新 技术干货