7. 输入与输出
7.1 更复杂的输出格式
用print()函数可以输出字符串到屏幕。对于输出的字符串,我们很多方法控制字符串的格式,如果你的python版本>=3.6,那么强烈推荐f字符串(f-string)。
f-字符串(f-string)
基础使用:
f'something{var}'
在普通字符串开头加上f,然后字符串内部 可以用{var}
标记,{var}
会被替换成变量的值。
year = 2016 event = 'Referendum' f'Results of the {year} {event}' #'Results of the 2016 Referendum'
在{}内的变量后添加格式说明符。
f'{变量:格式说明符号}'
格式说明符内容非常多,下面只举几个常见的例子,更多细节见本文附录。
:.长度f
控制浮点数小数点后面位数:
n = 1.23456 f'{n:.2f}'' # 小数点后2位 #1.23
':长度'
为该字段设置最小字符宽度,常用于列对齐:
table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} for name, phone in table.items(): print(f'{name:10} ==> {phone:10}')
详细的格式控制符在文档-Python标准库-文本处理服务-string中:string — 常见的字符串操作 — Python 3.10.4 文档
文章最后的附录摘取了部分说明。
repr与str
使用用 repr()
或 str()
函数可以值转化为字符串。
str()
函数返回供人阅读的值,repr()
则生成适于解释器读取的值。
如果没有对于没有支持供人阅读展示结果的对象, str()
返回与 repr()
相同的值。
一般情况下,数字、列表或字典等结构的值,使用这两个函数输出的表现形式是一样的。
字符串有两种不同的表现形式。
#先剧透一下,这两种方法实际上调用的是对象的__repr__
和__str__
方法(后面类里再说)。
实现对齐
str.rjust(width) 方法在左侧填充空格,保证指定宽度,实现对齐。
类似的还有str.ljust(width) 和str.center(width)
for x in range(1, 11): print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ') # Note use of 'end' on previous line print(repr(x*x*x).rjust(4))
这些方法不写入任何内容,只返回一个新字符串,如果输入的字符串太长,它们不会截断字符串,而是原样返回。
其它格式化字符串方法
- % 运算符(求余符)
- % 运算符也可用于字符串格式化。给定
'string' % values
,则string
中的%
实例会以零个或多个values
元素替换。此操作被称为字符串插值。例如: - str.format() f-字符串已经实现了它的功能,不再多说。
print('We are the {} who say "{}!"'.format('knights', 'Ni')) #输出: We are the knights who say "Ni!"
7.2 读写文件
我们首先要获取文件对象,然后调用文件对象的读写方法,最后关闭文件对象。
获取文件对象
open()
方法返回一个文件对象(用于读写)。通常使用
open(filename, mode, encoding=None)
来调用该方法,如:
f = open('workfile', 'w', encoding="utf-8")
第一个参数是文件名。第二个参数是打开方式,''w‘表示写入模式,‘r’’表示读取模式,'a’表示追加模式,'r+'表示读写模式,‘b’表示二进制格式。mode默认值为’r’。
我们通常读写的是文本文件,文本文件有一些不同的编码格式(encoding)。如果没有指定,默认值是所在操作系统默认编码。由于UTF-8是目前标准的编码格式,所以一般设置
encoding=“utf-8”。
在处理文件时,一般使用with
关键字,可以自动关闭文件。
否则需要使用f.close()来手动关闭,释放文件资源。
with open('workfile', encoding="utf-8") as f: read_data = f.read() # with 块结束后文件会被自动关闭 f.closed
文件对象的方法
假设已经有了文件对象f。
- f.read(size) 读取文件内容,返回字符串。size可选表示最多读取字符数,不写时默认读取整个文件。
- f.readline() 从文件读取单行数据,字符串末尾保留换行符。
f.readline()
返回空字符串,就表示已经到达了文件末尾,空行使用'\n'
表示,该字符串只包含一个换行符。
- f.readlines() 如需以列表形式读取文件中的所有行,可以用
list(f)
或f.readlines()
。
从文件中读取多行时,可以用循环遍历整个文件对象。这种操作能高效利用内存,快速,且代码简单:
for line in f: print(line, end='')
f.write(string)
把 string 的内容写入文件,并返回写入的字符数。f.tell()
返回整数,给出文件对象在文件中的当前位置,表示为二进制模式下时从文件开始的字节数,以及文本模式下的意义不明的数字。- f.seek(offset, whence) 可以改变文件对象的位置。通过向参考点添加 offset 计算位置;参考点由 whence 参数指定。 whence 值为 0 时,表示从文件开头计算,1 表示使用当前文件位置,2 表示使用文件末尾作为参考点。省略 whence 时,其默认值为 0,即使用文件开头作为参考点。
使用json
保存结构化数据
json全称是JavaScript Object Notation(JavaScript 对象表示法)。类似字典格式:
{ "sites": [ { "name":"菜鸟教程" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ] }
json
标准模块采用 Python 数据层次结构,并将之转换为字符串表示形式;这个过程称为 serializing (序列化)。从字符串表示中重建数据称为 deserializing (解序化)。
import json x = [1, 'simple', 'list'] json.dumps(x)
json.dump(x, f) # 序列化为json格式 x = json.load(f) # 转为python字典格式
附录:格式说明符(format_spec):
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type] fill ::= <any character> align ::= "<" | ">" | "=" | "^" sign ::= "+" | "-" | " " width ::= digit+ grouping_option ::= "_" | "," precision ::= digit+ type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
fill
是填充字符
align
是对齐方式
sign
是数字符号(±)'#' 选项可让“替代形式”被用于执行转换。 替代形式会针对不同的类型分别定义。 此选项仅适用于整数、浮点数和复数类型。 对于整数类型,当使用二进制、八进制或十六进制输出时,此选项会为输出值分别添加相应的 '0b', '0o', '0x' 或 '0X' 前缀。 对于浮点数和复数类型,替代形式会使得转换结果总是包含小数点符号,即使其不带小数部分。 通常只有在带有小数部分的情况下,此类转换的结果中才会出现小数点符号。 此外,对于 'g' 和 'G' 转换,末尾的零不会从结果中被移除。
width 是一个定义最小总字段宽度的十进制整数,包括任何前缀、分隔符和其他格式化字符。 如果未指定,则字段宽度将由内容确定。
当未显式给出对齐方式时,在 width 字段前加一个零 ('0') 字段将为数字类型启用感知正负号的零填充。 这相当于设置 fill 字符为 '0' 且 alignment 类型为 '='。
grouping_option中',' 选项表示使用逗号作为千位分隔符。 对于感应区域设置的分隔符,请改用 'n' 整数表示类型。
'_' 选项表示对浮点表示类型和整数表示类型 'd' 使用下划线作为千位分隔符。 对于整数表示类型 'b', 'o', 'x' 和 'X',将为每 4 个数位插入一个下划线。 对于其他表示类型指定此选项则将导致错误。
.precision,精度是一个十进制整数,对f'``F指示应在小数点后显示多少位数字,对于g``G类型,指示小数点之前和之后显示多少位数字。
对于字符串表示类型,该字段指示最大字段大小 - 换句话说,最多字符数。整数表示类型不允许使用精度。
type 确定了数据应如何呈现(例如进制)。