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)
代码语言:javascript复制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()来手动关闭,释放文件资源。
代码语言:javascript复制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()
。
从文件中读取多行时,可以用循环遍历整个文件对象。这种操作能高效利用内存,快速,且代码简单:
代码语言:javascript复制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 对象表示法)。类似Python的字典:
代码语言: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)
如果f是文件对象,可以用下面方法在文件中读写json格式数据。(当然,f是用with open..打开的)
代码语言:javascript复制json.dump(x, f) # 序列化为json格式
x = json.load(f) # 转为python字典格式
附录:格式说明符(format_spec):
代码语言:javascript复制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 确定了数据应如何呈现(例如进制)。