读取文件的三个方法:read()、readline()、readlines()。均可接受一个方法参数用以限制每次读取的数据量,但通常不使用。
read()
优点:读取整个文件,将文件内容放到一个字符串变量中。
劣势:如果文件非常大,尤其是大于内存时,无法使用read()方法。
总结:不适用于读取大文件
readline()
优点:readline()方法每次读取一行;返回的是一个字符串对象,保存当前行的内存,不占用内存
缺点:比readlines慢得多
包含知识点
当你每次调用readline()方法时,你的文件指针就会指向当前行尾部,一个换行符\n占两位,一个中文也是读取到最后一行之后再调用readline()就会返回空,结束循环readlines()
特点:一次性读取整个文件;自动将文件内容分析成一个行的列表
包含知识点
readlines()读取所有行然后把它们作为一个字符串列表返回返回的每一行内容包含换行符文件关闭:
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try...finally来实现:
try:f = open('/path/to/file', 'r')print(f.read())finally:if f:f.close()
每次这样写太繁琐了,所以Python引入了with open()来自动调用close()方法,无论是否出错
open()与with open() 区别
1、open需要主动调用close(),with不需要
2、open读取文件时发生异常,没有任何处理,with有很好的处理上下文产生的异常
with open()同时操作多个文件
with open("test/test.py", 'r') as f1, open("test/test2.py", 'r') as f2:print(f1.read())print(f2.read())
写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,需要将mode参数改成可写的模式,如上面的表格所示
f = open("test/test.py", "a+")f.write("test")f.writelines("polo")print(f.read())f.close()
写文件的原理
当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。
只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
所以,还是用with语句好鸭!
关于字符编码
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码,默认encoding=None
例如,读取utf-8编码的文件:
f = open('test/utf8.txt', 'r', encoding='utf-8')print(f.read())
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。
遇到这种情况,open()函数还接收一个errors参数,默认是errors=None表示如果遇到编码错误后如何处理。最简单的方式是直接忽略。
f = open('test/utf8.txt', 'r', encoding='utf-8', errors='ignore')
os.open()
格式
os.open(file, flags[, mode])