python
在写python 代码的过程,我发现在读写文件的过程中有的时候会出现点问题,所以还是想花点时间总结一下,加深一下自己的印象。
读文件
python 中可以用 内置的open()函数来打开一个文件。源码中是这样定义的
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
一般情况向,只需要考虑前面两个参数,也就是 file 和 mode,file 代表的是文件路径,mode指的是打开方式,默认是读方式打开,具体如下表:
mode | annotation |
---|---|
‘r’ | 以读方式打开 |
‘w’ | 以写方式打开 |
‘a’ | 以追加模式打开 |
‘x’ | 新建一个文件,且以写方式打开 |
‘b’ | 二进制模式 |
‘t’ | text 模式,也就是打开的结果是 str类型的,默认的 |
‘+’ | (打开磁盘文件更新) 读写模式 |
示例(介绍比较常用的):
- 以读方式打开文件
#【英文】
#第一种
file = open('/Users/lionel/Downloads/english.txt')
#第二种
file = open('/Users/lionel/Downloads/english.txt','r')
#【中文】
file = open('/Users/lionel/Downloads/Chinese.txt', 'r')
print(file)#控制台无显示,需要以二进制打开,下节会讲
- 以二进制形式打开
#【英文】
# 以二进制读出,和以读方式读出区别在于开始处多一个 b 字符,标示着是二进制
file = open('/Users/lionel/Downloads/english.txt','rb')
#【中文】
file = open('/Users/lionel/Downloads/Chinese.txt','rb')
中文以二进制打开的结果是:
b'\xe6\xa2\x85\xe8\xa5\xbf\xe6\x98\xaf\xe4\xbd\x8d\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe8\xb6\xb3\xe7\x90\x83\xe8\xbf\x90\xe5\x8a\xa8\xe5\x91\x98\n'
想要表示为中文
file.read().decode('utf-8')
结果是:
梅西是位伟大的足球运动员
- 读一行文件
前面调用read()方法可以一次性读取所有内容,可以使用readline()一行一行地读取。
file = open('/Users/lionel/Downloads/Chinese.txt','rb')
file.readline().decode('utf-8')
注意:
- 文件打开后,使用 close() 完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
- 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现。
try:
file = open('/Users/lionel/Downloads/Chinese.txt','rb')
print(file.read().decode('utf-8'))
finally:
if file:
file.close()
- 但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
with open('/Users/lionel/Downloads/Chinese.txt', 'rb') as file:
print(file.read().decode('utf-8'))
写文件
写文件其实个读文件是类似的,唯一的区别在于调用的 python 的内置函数 open()函数,传入标识符’w’或者’wb’表示写文本文件或写二进制文件。然后调用 write ()向文件中写入内容。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。
output = open('output', 'wb')
output.write(text)
由于写文件和读文件类似,在这里面就不详细介绍了,有兴趣的可以自己去了解。同样记住要执行 close()方法,建议直接使用 with 语句。
参考文件:python文件读写