Python · 输入与输出

文件

实际开发中经常遇到对数据进行持久化操作的场景,而实现数据持久化最直接简单的方式就是将数据保存到文件中。Python 实现文件的读写操作其实非常简单,通过内置的 open 函数,可以指定文件名、操作模式、编码信息等来获得操作文件的对象,然后就可以对文件进行读写操作了。

对象方法 具体含义
read 读取
readline 读取文件每一行
write 写入
close 关闭文件
操作模式 具体含义
'r' 读取 (默认)
'w' 写入(会先截断之前的内容)
'x' 写入,如果文件已经存在会产生异常
'a' 追加,将内容写入到已有文件的末尾
'b' 二进制模式
't' 文本模式(默认)
'+' 更新(既可以读又可以写)

示例io_using_file.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''

# 打开文件以编辑(writing)
f = open('poem.txt', 'w')
# 向文件中编写文本
f.write(poem)
# 关闭文件
f.close()

# 如果没有特别指定,将假定启用默认的阅读(read)模式
f = open('poem.txt')
while True:
line = f.readline()
# 零长度指示 EOF
if len(line) == 0:
break
# 每行的末尾都已经有了换行符,因为它是从一个文件中进行读取的
print(line, end='')

# 关闭文件
f.close()

输出:
$ python3 io_using_file.py
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!

读写文本文件

  • 使用 open 函数打开文件
  • 使用 encoding 参数指定编码
  • 使用 with 语句来自动调用 close() 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# encoding=utf-8
import time

def main():
# 一次性读取整个文件内容
with open('致橡树.txt', 'r', encoding='utf-8') as f:
print(f.read())

# 通过for-in循环逐行读取
with open('致橡树.txt', mode='r') as f:
for line in f:
print(line, end='')
time.sleep(0.5)
print()

# 读取文件按行读取到列表中
with open('致橡树.txt') as f:
lines = f.readlines()
print(lines)

if __name__ == '__main__':
main()

读写二进制文件

  • 使用 rb 读取二进制图片
  • 使用 wb 写入二进制图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def main():
try:
with open('python.jpg', 'rb') as fs1:
data = fs1.read()
print(type(data)) # <class 'bytes'>
with open('python_bak.jpg', 'wb') as fs2:
fs2.write(data)
except FileNotFoundError as e:
print('指定的文件无法打开.')
except IOError as e:
print('读写文件时出现错误.')
print('程序执行结束.')

if __name__ == '__main__':
main()

读写 JSON 文件

  • 序列化:把变量从内存中变成可存储或传输的过程称之为序列化。
  • 反序列化:把变量从序列化的对象重新读到内存里称之为反序列化。
  • json:可以实现 Python 对象和 JSON 格式的序列化和反序列化。
  • pickle:使用特有的序列化协议来序列化数据。
json 库方法 具体含义
dump 将 Python 对象按照 JSON 格式序列化到文件中
dumps 将 Python 对象处理成 JSON 格式的字符串
load 将文件中的 JSON 数据反序列化成对象
loads 将字符串的内容反序列化成 Python 对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import json

def main():
mydict = {
'name': '狄仁杰',
'age': 38,
'qq': 957658,
'friends': ['王大锤', '李元芳'],
'cars': [
{'brand': 'BYD', 'max_speed': 180},
{'brand': 'Audi', 'max_speed': 280},
{'brand': 'Benz', 'max_speed': 320}
]
}
try:
with open('data.json', 'w', encoding='utf-8') as fs:
json.dump(mydict, fs)
except IOError as e:
print(e)
print('保存数据完成!')

if __name__ == '__main__':
main()
JSON 类型 Python 类型
{} dict
[] list
“string” str
1234.56 intfloat
true/false True / False
null None

示例io_pickle.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import pickle

# 我们存储相关对象的文件的名称
shoplistfile = 'shoplist.data'

# 需要购买的物品清单
shoplist = ['apple', 'mango', 'carrot']

# 准备写入文件
f = open(shoplistfile, 'wb')

# 转储对象至文件
pickle.dump(shoplist, f)
f.close()

# 清除 shoplist 变量
del shoplist

# 重新打开存储文件
f = open(shoplistfile, 'rb')

# 从文件中载入对象
storedlist = pickle.load(f)
print(storedlist)

输出:
$ python io_pickle.py
['apple', 'mango', 'carrot']