【CookBook】 Chapter5

Chapter5 文件与IO

5.1 读写文本数据

ascii对应从U+0000到U+007F范围内的7位字符。latin-1是字节0-255到U+0000至U+00FF范围内Unicode字符的直接映射。
当读取一个未知编码的文本时使用latin-1编码永远不会产生解码错误。
  • 可以给 open() 函数传递一个可选的 errors 参数来处理文本编码错误

1
2
3
4
5
6
7
8
>>> # Replace bad chars with Unicode U+fffd replacement char
>>> f = open('sample.txt', 'rt', encoding='ascii', errors='replace')
>>> f.read()
'Spicy Jalape?o!'
>>> # Ignore bad chars entirely
>>> g = open('sample.txt', 'rt', encoding='ascii', errors='ignore')
>>> g.read()
'Spicy Jalapeo!'

5.2-3 打印输出

在 print() 函数中指定 file 关键字参数

1
2
with open('somefile.txt', 'wt') as f:
print('Hello World!', file=f)

改变默认的分隔符或者行尾符,可以使用在 print() 函数中使用sepend 关键字参数

1
2
3
4
5
6
>>> print('ACME', 50, 91.5)
ACME 50 91.5
>>> print('ACME', 50, 91.5, sep=',')
ACME,50,91.5
>>> print('ACME', 50, 91.5, sep=',', end='!!\n')
ACME,50,91.5!!

5.5 x模式–禁止覆盖写入

你想像一个文件中写入数据,但是前提必须是这个文件在文件系统上不存在。也就是不允许覆盖已存在的文件内容。
1
2
3
4
5
6
7
8
9
>>> with open('somefile', 'wt') as f:
... f.write('Hello\n')
...
>>> with open('somefile', 'xt') as f:
... f.write('Hello\n')
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'somefile'

5.6 字符串IO

使用 io.StringIO() 和 io.BytesIO() 类来创建类文件对象操作字符串数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> s = io.StringIO()
>>> s.write('Hello World\n')
12
>>> print('This is a test', file=s)
15
>>> # Get all of the data written so far
>>> s.getvalue()
'Hello World\nThis is a test\n'
>>>

>>> # Wrap a file interface around an existing string
>>> s = io.StringIO('Hello\nWorld\n')
>>> s.read(4)
'Hell'
>>> s.read()
'o\nWorld\n'

5.7 读写压缩文件

5.19 临时文件


【CookBook】 Chapter5
http://blog.rainna.xyz/2020/12/11/2020-12-11-Chapter5/
作者
rainnalv
发布于
2020年12月11日
许可协议