Python基础-7 输入与输出

2022-12-06 09:04:49 浏览数 (1)

7. 输入与输出

7.1 更复杂的输出格式

print()函数可以输出字符串到屏幕。对于输出的字符串,我们很多方法控制字符串的格式,如果你的python版本>=3.6,那么强烈推荐f字符串(f-string)。

f-字符串(f-string)

基础使用:

f'something{var}'

在普通字符串开头加上f,然后字符串内部 可以用{var}标记,{var}会被替换成变量的值。

代码语言:javascript复制
year = 2016
event = 'Referendum'
f'Results of the {year} {event}'
#'Results of the 2016 Referendum'

在{}内的变量后添加格式说明符。

f'{变量:格式说明符号}'

格式说明符内容非常多,下面只举几个常见的例子,更多细节见本文附录。

:.长度f控制浮点数小数点后面位数:

代码语言:javascript复制
n = 1.23456
f'{n:.2f}''  # 小数点后2位
#1.23

:长度 为该字段设置最小字符宽度,常用于列对齐:

代码语言:javascript复制
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)来调用该方法,如:

代码语言:javascript复制
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 (解序化)。

代码语言:javascript复制
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 确定了数据应如何呈现(例如进制)。


0 人点赞