python教程(十)输入输出

输入输出介绍

有几种方法可以显示程序的输出;数据可以以人类可读的形式打印出来,或者写入文件以供将来使用。
##更漂亮的输出格式

  • 使用格式字字符串字面值 请在字符串的开始引号或三引号之间加上一个f或F。在此字符串中,你可以在{和}字符之间写可以引用的变量或字面值的Python表达式。
year = 2019
event = 'Referendum'
f'Results of the {year} {event}'#Results of the 2016 Referendum
  • 字符串的str.format()方法需要更多的手动操作。你仍将使用{和}来标记变量将被替换的位置,并且可以提供详细的格式化指令,但你还需要提供要格式化的信息。
yes_votes = 42_572_654
no_votes = 43_132_495
percentage = yes_votes / (yes_votes + no_votes)
'{:-9} YES votes {:2.2%}'.format(yes_votes, percentage)#
  • 最后,你可以使用字符串切片和连接操作自己完成所有的字符串处理,以创建你可以想象的任何布局。字符串类型有一些方法可以执行将字符串填充到给定列宽的有用操作。
    当你不需要花哨的输出而只是想快速显示某些变量以进行调试时,可以使用 repr()or str() 函数将任何值转化为字符串。

str() 函数是用于返回人类可读的值的表示,而 repr() 是用于生成解释器可读的表示(如果没有等效的语法,则会强制执行 SyntaxError)对于没有人类可读性的表示的对象, str() 将返回和 repr() 一样的值。很多值使用任一函数都具有相同的表示,比如数字或类似列表和字典的结构。特殊的是字符串有两个不同的表示。

格式化字符串文字

格式化字符串字面值常简称为f-字符串能让你在字符串前加上f和F并将表达式写成{expression}来自字符串中包含Python表达式的值。

可选的格式说明符可以跟在表达式后面。这样可以更好地控制值的格式化方式。一下示例将pi舍入到小数点后三位

import math
print(f'The value of pi is approximately {math.pi:.3f}')#The value of pi is approximately 3.142.

在‘:’后传递一个整数可以让该字段成为最小字符宽度。这在使列对齐时很有用。:

table = {'Sjoerd' : 4127, 'Jack' : 4098, 'Dcab' : 7678}
for name, phone in table.items():
    print(f'{name:10} ==> {phone:10d}')

在这里插入图片描述
其他的修饰符可用于在格式化之前转化值。 ‘!a’ 应用 ascii() ,’!s’ 应用 str(),还有 ‘!r’ 应用 repr():
有关这些格式规范的参考,请参阅参考指南 Format Specification Mini-Language

字符串的format()方法

str.format()方法的基本用法如下所示:

print('We are the {} who say '''{}!''.format('knights', 'Ni'))#We are the knights who say "Ni!"

花括号和其中的字符(称为格式字段)将替换为传递给str.format()方法的对象。花括号中的数字用来表示传递给str.format()方法的对象的位置。

print('{0} and {1}'.format('spam', ''eggs))#spam and eggs
print('{1} and {0}'.format('spam', 'eggs'))#eggs and spam 

如果在str.format() 方法中使用关键字,则使用参数的名称引用它们的值。:

print('This {food} is {adjective}.'.format(
    food='spam', adjective='absolutely horrible'))#This spam is absolutely horrible.

位置和关键字参数可以任意组合:

print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg'))#The story of BIll,Manfred, and Georg.

如果你有一个非常长的格式字符串,你不想把它拆开,,那么你最好按名称而不是位置引用变量来进行格式化。或者可以通过简单地传递字典和使用方括号‘[]’访问键来完成:

table = {'Sjoerd': 4127, 'Jack':4098, 'Dcab':8637678}
print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; Dcab: {0[Dcab]:d}'.format(table))

这在与内置函数vars()结合时非常有用,它会返回包含所有局部变量的字典。

for x in range(1, 11):
    print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))

关于使用str.format()进行字符串格式化的完整概述,请参阅Format String Syntax

读写文件

open()返回一个file object,最常用的有两个参数:open(filename, mode)

f = open('workfile', 'w')

第一个参数是包含文件名的字符串。第二个是另一个字符串,其中包含一些描述文件使用方式的字符。mode 可以是 ‘r’ ,表示文件只能读取,‘w’ 表示只能写入(已存在的同名文件会被删除),还有 ‘a’ 表示打开文件以追加内容;任何写入的数据会自动添加到文件的末尾。‘r+’ 表通常文件是以 text mode 打开的,这意味着从文件中读取或写入字符串时,都会以指定的编码方式进行编码。如果未指定编码格式,默认值与平台相关 (参见open())。在mode 中追加的 ‘b’ 则以 binary mode 打开文件:现在数据是以字节对象的形式进行读写的。这个模式应该用于所有不包含文本的文件。示打开文件进行读写。mode 参数是可选的;省略时默认为 ‘r’。
在处理文件对象时,最好使用 with 关键字。 优点是当子句体结束后文件会正确关闭,即使在某个时刻引发了异常。 而且使用 with 相比等效的 try-finally 代码块要简短得多:
在这里插入图片描述
在这里插入图片描述

文件对象的方法

假定已经创建名为f的文件对象。要读取文件内容,请调用f.read(size),它会读取一些数据并将其作为字符串(在文本模式下)或字节对象(在二进制模式下)返回。size是一个可选数字参数。当size被省略或者为负的时候,将读取并返回文件的整个内容;如果文件的大小是机器内存的那么就可能出现问题。否则,最多读取并返回size字节的内容,如果已到达文件末尾,f.read()将返回一个空字符串(‘’)。

f.read()#‘This is the entire file.\n’
f.read()#' '

f.readline() 从文件中读取一行;换行符(\n)留在字符串的末尾,如果文件不以换行符结尾,则在文件的最后一行省略。这使得返回值明确无误;如果 f.readline() 返回一个空的字符串,则表示已经到达了文件末尾,而空行使用 ‘\n’ 表示,该字符串只包含一个换行符。:

f.readline()#'This is the first line of the file.\n'
f.readline()#'Second line of the file\n'
f.readline()#' '

要从文件中读取行,你可以循环遍历文件对象。这是内存高效,快速的,并简化代码:

for line in f:
    print(line, end=' ')

在这里插入图片描述
如果你想以列表的形式读取文件中的所有行,你也可以使用 list(f) 或 f.readlines()。
f.write(string) 会把 string 的内容写入到文件中,并返回写入的字符数。:

f.write('This is a test\n')#15

要改变文件对象的位置,请使用 f.seek(offset, from_what) 。通过向参考点添加 offset 来计算位置;参考点由 from_what 参数指定。from_what*值为0时,表示从文件开头开始,1 表示从当前位置,2 表示把文件末尾作为参考点。*from_what 可以省略,默认为0,即使用文件开头作为参考点。:

with open('workfile.txt', 'wb') as f:
    f.write(b'0123456789abcedf')
    print(f.seek(5))
    
with open('workfile.txt', 'rb') as f:
    print(f.read(1))
    print(f.seek(-3, 2))
    print(f.read(1))

在这里插入图片描述
在文本文件(那些在模式字符串中没有 b 的打开的文件)中,只允许相对于文件开头搜索(使用 seek(0, 2) 搜索到文件末尾是个例外)并且唯一有效的 offset 值是那些能从 f.tell() 中返回的或者是零。其他 offset 值都会产生未定义的行为。

使用json保存数据结构化数据

字符串可以很轻松地写入文件并从文件中读取出来。数字可能会费点劲,因为 read() 方法只能返回字符串,这些字符串必须传递给类似 int() 的函数,它会接受类似 ‘123’ 这样的字符串并返回其数字值 123。当你想保存诸如嵌套列表和字典这样更复杂的数据类型时,手动解析和序列化会变得复杂。
Python 允许你使用称为 JSON (JavaScript Object Notation) 的流行数据交换格式,而不是让用户不断的编写和调试代码以将复杂的数据类型保存到文件中。
名为 json 的标准模块可以采用 Python 数据层次结构,并将它们转化为字符串表示形式;这个过程称为 serializing 。从字符串表示中重建数据称为 deserializing 。在序列化和反序列化之间,表示对象的字符串可能已存储在文件或数据中,或通过网络连接发送到某个远程机器。

基础篇

猜你喜欢

转载自blog.csdn.net/tianzhiya121/article/details/90021820
今日推荐