Python基础-文件读写

打开文件

open()函数用来打开文件,语法如下:

1
open(filename[, mode[, buffering]])

open()函数使用一个文件名作为唯一的强制参数,然后返回一个文件对象模式(mode)和缓冲(buffering)参数都是可选的。
官方文档对open()函数的说明:

open() returns a file object, and is most commonly used with two arguments: open(filename, mode).
open()函数返回一个文件对象,open()函数通常带有两个参数:open(filename, mode)。
The mode argument is optional; ‘r’ will be assumed if it’s omitted.
模式参数是可选的;如果省略这一参数,那么默认使用’r’这一模式参数。

默认情况下,open()函数的默认模式参数为’r’,用来只读打开文件。但如果处理的是一些其他类型的文件(二进制文件),比如声音剪辑或者图像,那么应该在模式参数中增加’b’。参数’rb’可以用来读取一个二进制文件。

表1 open()函数中模式参数的常用值
描述
‘r’ 读模式
‘w’ 写模式
‘a’ 追加模式
‘b’ 二进制模式
‘+’ 读/写模式

其中’b’和’+’模式可以添加到其他模式中使用。
假设现在我们有一个文件名为IOtest.txt,存放在windows10系统的桌面,那么可以像下面这样以不同的模式打开文件:

1
2
3
4
5
# 带有模式参数的open()函数示例
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'r') # 以读模式打开一个文件
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'w') # 以写模式打开一个文件
f = open('binaryfilename', 'rb') # 用来读取一个二进制文件,binaryfilename为你的文件路径
f = open('binaryfilename', 'wb') # 用来写一个二进制文件,binaryfilename为你的文件路径

读文件

假设IOtest.txt这个文件中存储了以下内容:

1
2
3
this is the first line of the file
this is the second line of the file
this is the last line of the file

下面介绍几种读取文件的方法:

read()

1
2
3
4
5
6
7
8
9
10
11
12
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'r')  # 以读模式打开文件

# 使用read()方法可以一次读取文件的全部内容,并表示为str对象
content = f.read()
print(content)
f.close() # 文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

"""
this is the first line of the file
this is the second line of the file
this is the last line of the file
"""

read(size)

1
2
3
4
5
6
7
8
9
10
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'r')  # 以读模式打开文件

# read(size)方法每次最多读取size个字节的内容
content = f.read(7) # 读取文件前7个字节的内容
print(content)
f.close()

"""
this is
"""

readline()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'r')  # 以读模式打开文件

# readline()方法每次读取一行内容,读取的内容和你使用的次数有关, 使用第二次的时候, 读取到的是文本的第二行, 以此类推
first_content = f.readline() # 读取第一行
print(first_content)

"""
this is the first line of the file
"""

second_content = f.readline() # 读取第二行
print(second_content)

"""
this is the second line of the file
"""

f.close()

readlines()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'r')  # 以读模式打开文件

# readlines()方法一次读取所有内容并返回一个list,文件中的每一行对应该list中的每一个元素
content = f.readlines()
print(content)

"""
['this is the first line of the file\n', 'this is the second line of the file\n', 'this is the last line of the file ']
"""

for line in content:
print(line.strip()) # 把末尾的'\n'删掉

"""
this is the first line of the file
this is the second line of the file
this is the last line of the file
"""

f.close()

使用with自动调用close()方法

1
2
3
4
5
6
7
8
9
10
11
12
"""
文件使用完毕后必须关闭,try ... finally写法又太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法
"""

with open('C:/Users/Deep/Desktop/IOtest.txt', 'r') as f:
print(f.read())

"""
this is the first line of the file
this is the second line of the file
this is the last line of the file
"""

字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

1
2
3
4
5
6
7
f = open('C:/Users/Deep/Desktop/gbk.txt', 'r', encoding='gbk')  # gbk.txt是GBK编码的文件,存储内容为"测试"两个汉字
f.read()
f.close()

"""
'测试'
"""

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

1
f = open('C:/Users/Deep/Desktop/gbk.txt', 'r', encoding='gbk', errors='ignore')

Tips:

  • 如果文件很小,read()一次性读取最方便;
  • 如果不能确定文件大小,反复调用read(size)比较保险;
  • 如果是配置文件,调用readlines()最方便;
  • 使用with语句自动帮我们调用close()方法,使代码更加简洁

写文件

写文件和读文件是一样的,唯一区别是调用open()函数时,传入模式参数’w’或者’wb’表示写文本文件或写二进制文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 'w'模式会在第二次写入时(已调用close()函数)重写原文件的内容
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'w') # 以写模式打开文件
mytext = 'Hello, world!'
f.write(mytext)
f.close()

"""
IOtest.txt文件内容变为Hello, world!
"""

# 'a'模式在原文件的尾部追加内容而不修改原文件内容
f = open('C:/Users/Deep/Desktop/IOtest.txt', 'a') # 以追加模式打开文件
mytext = '\nHello, world!' # 加上'\n'换行符
f.write(mytext)
f.close()

"""
IOtest.txt文件内容变为:
Hello, world!
Hello, world!
"""

你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句比较保险:

1
2
with open('C:/Users/Deep/Desktop/IOtest.txt', 'w') as f:
f.write('Hello, world!')

要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。

小结

  • 在Python中,文件读写是通过open()函数打开的文件对象完成的;
  • 使用with语句操作文件IO是个好习惯。

参考资料:

-------------本文结束感谢您的阅读-------------

本文标题:Python基础-文件读写

文章作者:丁鹏

发布时间:2017年12月05日 - 20:12

最后更新:2019年07月01日 - 22:07

原始链接:http://deepon.me/2017/12/05/Python基础-文件读写/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

给博主投币,共同实现开源世界
0%