Python3 输入和输出
在前面几个章节中,我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。
输出格式美化
Section titled “输出格式美化”Python两种输出值的方式: 表达式语句和 print() 函数。
第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。
如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。
- str(): 函数返回一个用户易读的表达形式。
- repr(): 产生一个解释器易读的表达形式。
这里有两种方式输出一个平方与立方的表:
注意: 在第一个例子中, 每列间的空格由 print() 添加。
这个例子展示了字符串对象的 rjust() 方法, 它可以将字符串靠右, 并在左边填充空格。
还有类似的方法, 如 ljust() 和 center()。 这些方法并不会写任何东西, 它们仅仅返回新的字符串。
另一个方法 zfill(), 它会在数字的左边填充 0,如下所示:
str.format() 的基本使用如下:
括号及其里面的字符 (称作格式化字段) 将会被 format() 中的参数替换。
在括号中的数字用于指向传入对象在 format() 中的位置,如下所示:
如果在 format() 中使用了关键字参数, 那么它们的值会指向使用该名字的参数。
位置及关键字参数可以任意的结合:
!a (使用 ascii()), !s (使用 ** str()) 和 !r (使用 ** repr()) 可以用于在格式化某个值之前对其进行转化:
可选项 : 和格式标识符可以跟着字段名。 这就允许对值进行更好的格式化。 下面的例子将 Pi 保留到小数点后三位:
在 : 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用。
如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。
最简单的就是传入一个字典, 然后使用方括号 [] 来访问键值 :
也可以通过在 table 变量前使用 ** 来实现相同的功能:
旧式字符串格式化
Section titled “旧式字符串格式化”% 操作符也可以实现字符串格式化。 它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的代入, 然后返回格式化后的字符串. 例如:
因为 str.format() 是比较新的函数, 大多数的 Python 代码仍然使用 % 操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format().
读取键盘输入
Section titled “读取键盘输入”Python 提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。
这会产生如下的对应着输入的结果:
在 Python 中,文件操作通过 open() 函数完成。该函数会返回一个文件对象(file object),用于后续的读取或写入操作。
open() 的基本语法如下:
- filename: 要访问的文件路径(字符串)。
- mode: 文件打开模式,用于指定读写方式(如只读、写入、追加等)。该参数是可选的,默认值为
r(只读)。
常见文件打开模式如下(建议重点掌握 r / w / a):
| 模式 | 描述 |
| r | 只读方式打开文件(默认模式),文件必须存在,文件指针位于开头。 |
| rb | 以二进制格式只读打开文件(如图片、视频等),文件指针位于开头。 |
| r+ | 以读写方式打开文件,文件必须存在,文件指针位于开头。 |
| rb+ | 以二进制格式读写打开文件,文件指针位于开头。 |
| w | 只写方式打开文件。如果文件存在会被清空;不存在则创建新文件。 |
| wb | 以二进制格式只写打开文件。如果文件存在会被清空;不存在则创建新文件。 |
| w+ | 读写方式打开文件。如果文件存在会被清空;不存在则创建新文件。 |
| wb+ | 以二进制格式读写打开文件。如果文件存在会被清空;不存在则创建新文件。 |
| a | 追加方式打开文件。如果文件存在,写入内容会追加到末尾;不存在则创建新文件。 |
| ab | 以二进制格式追加写入文件,写入内容会追加到末尾;不存在则创建新文件。 |
| a+ | 读写方式打开文件,文件指针默认在末尾(追加模式);不存在则创建新文件。 |
| ab+ | 以二进制格式读写打开文件,文件指针默认在末尾;不存在则创建新文件。 |
说明: 在模式后添加 b 表示以二进制方式操作文件,常用于处理图片、音频等非文本文件。
下图很好的总结了这几种模式:
| 模式 | r | r+ | w | w+ | a | a+ |
|---|---|---|---|---|---|---|
| 读 | + | + | + | + | ||
| 写 | + | + | + | + | + | |
| 创建 | + | + | + | + | ||
| 覆盖 | + | + | ||||
| 指针在开始 | + | + | + | + | ||
| 指针在结尾 | + | + |
以下实例将字符串写入到文件 foo.txt 中:
- 第一个参数为要打开的文件名。
- 第二个参数描述文件如何使用的字符。 mode 可以是 ‘r’ 如果文件只读, ‘w’ 只用于写 (如果存在同名文件则将被删除), 和 ‘a’ 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. ‘r+’ 同时用于读写。 mode 参数是可选的; ‘r’ 将是默认值。
此时打开文件 foo.txt,显示如下:
文件对象的方法
Section titled “文件对象的方法”本节中剩下的例子假设已经创建了一个称为 f 的文件对象。
f.read()
Section titled “f.read()”为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
以下实例假定文件 foo.txt 已存在(上面实例中已创建):
执行以上程序,输出结果为:
f.readline()
Section titled “f.readline()”f.readline() 会从文件中读取单独的一行。换行符为 ‘\n’。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
执行以上程序,输出结果为:
f.readlines()
Section titled “f.readlines()”f.readlines() 将返回该文件中包含的所有行。
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
执行以上程序,输出结果为:
另一种方式是迭代一个文件对象然后读取每行:
执行以上程序,输出结果为:
这个方法很简单, 但是并没有提供一个很好的控制。 因为两者的处理机制不同, 最好不要混用。
f.write()
Section titled “f.write()”f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。
执行以上程序,输出结果为:
如果要写入一些不是字符串的东西, 那么将需要先进行转换:
执行以上程序,打开 foo1.txt 文件:
f.tell()
Section titled “f.tell()”f.tell() 用于返回文件当前的读/写位置(即文件指针的位置)。文件指针表示从文件开头开始的字节数偏移量。f.tell() 返回一个整数,表示文件指针的当前位置。
f.seek()
Section titled “f.seek()”如果要改变文件指针当前的位置, 可以使用 f.seek(offset, from_what) 函数。
f.seek(offset, whence) 用于移动文件指针到指定位置。
offset 表示相对于 whence 参数的偏移量,from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
- seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
- seek(x,1) : 表示从当前位置往后移动x个字符
- seek(-x,2):表示从文件的结尾往前移动x个字符
from_what 值为默认为0,即文件开头。下面给出一个完整的例子:
f.close()
Section titled “f.close()”在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。
当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常。
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:
文件对象还有其他方法, 如 isatty() 和 trucate(), 但这些通常比较少用。
pickle 模块
Section titled “pickle 模块”python的pickle模块实现了基本的数据序列和反序列化。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
基本接口:
有了 pickle 这个对象, 就能对 file 以读取的形式打开:
注解: 从 file 中读取一个字符串,并将它重构为原来的python对象。
file: 类文件对象,有read()和readline()接口。