1.打开/关闭文件
首先来看一下Python中的open函数:
open(file, mode='r', buffering=-1, encoding=None)
1)file: 文件名
2)mode: 这个跟标准c库中fopen中的mode参数取值类似:
'r': 以只读方式打开文件,如果文件不存在,则会抛出IOError
‘w': 以只写方式打开文件,如果文件不存在,则会自动创建文件;如果文件已经存在,则会清空文件已有的内容
'a': 以追加的方式打开,一般会与'w'联合使用;
'b': 二进制模式打开,表示此文件中的数据不是文本数据;
'+': 读/写模式, 'r+':表示读写方式打开文件,'w+'以读写方式打开文件;
4)buffering: 表示是否使用缓存,如果使用缓存的话,我们往文件中写入数据时,并不会马上写入到文件中,而是写入到缓存中,直至我们flush()或者close()时,才会把缓存中的数据写入到文件中;
5)encoding: 指定写入字符的编码,如utf-8
open函数如果成功,则会返回一个file object,否则返回None.
关闭文件: close()函数
f = open(file='data.txt', mode='w+', encoding='utf-8') if f: print('open %s success' % f.name) f.close() else: print('open failed') >>> open data.txt success
2.读写文件
在open成功后,会返回一个file object,文件的读写函数,就是调用file object中的读写函数来完成的。
1)write(str): 把str写入到文件中
2)writelines(seq): 把序列中的每一个元素依次写入到文件中,注意每个元素直接并不会自动插入换行符file.linesep
3)read(): 返回整个文件的数据
4)readline(): 返回文件中的一行数据
5)readlines(): 以list的方式返回文件中的每一行数据,注意每一行的换行符并没有去除
6)read(nums): 读取指定nums个字符
当已读取到EOF时,会返回None。
#写入文件 f = open(file='data.txt', mode='w', encoding='utf-8') if f: print('open %s success' % f.name) f.write('hello Python\n') lines = ('hello\n', 'world') f.writelines(lines) f.close() else: print('open failed')
#读取文件 try: f = open('data.txt') print(f.readlines()) except IOError: print('file IOError') finally: f.close() >>> ['hello Python\n', 'hello\n', 'world']
如果文件比较大,调用read()或者readlines()一次性把所有的数据读取到内存中,会占用较大的内容空间,所以一般的建议是一部分一部分的读取:
#循环读取并处理 try: f = open('data.txt') while True: line = f.readline() if line: print(line) else: break except IOError: print('file IOError') finally: f.close() >>> hello Python hello world
在上面的代码中,我们发现每次都要在finally中加入f.close(),比较麻烦,所以Python在2.5之后,引入with语句:可以自动帮助我们在语句结束后关闭文件,即使是异常引起的结束:
with open('data.txt') as f: while True: line = f.readline() if line: print(line) else: break
3.文件迭代器
在Python2.2开始,file object是可以迭代的,这意味着可以直接在for循环中使用。
#iteraing file object with open('data.txt') as f: for line in f: print(line)
执行后的输出与上面一样,但是代码显得更加的简洁。
file object还有seek, trunscate, flush等方法,这些方法都是跟c标准库中的方法对应的。