6、python基础:文件输入输出详解
文章目录
- 前言
- 一、更复杂的输出格式
- 二、字符串 format() 方法
- 三、读写文件
- 四、文件对象的方法
- 五、使用 json 保存结构化数据
- python官方文档链接
- python官方标准库链接
前言
余生平,怎一个懒字了得。
一、更复杂的输出格式
对输出格式的控制不只是打印空格分隔的值,还需要更多方式。格式化输出包括以下几种方法。
使用 格式化字符串字面值 ,要在字符串开头的引号/三引号前添加 f 或 F 。在这种字符串中,可以在 { 和 } 字符之间输入引用的变量,或字面值的 Python 表达式。
>>> year = 2016
>>> 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)
' 42572654 YES votes 49.67%'最后,还可以用字符串切片和合并操作完成字符串处理操作,创建任何排版布局。字符串类型还支持将字符串按给定列宽进行填充,这些方法也很有用。
如果不需要花哨的输出,只想快速显示变量进行调试,可以用 repr() 或 str() 函数把值转化为字符串。
str() 函数返回供人阅读的值,repr() 则生成适于解释器读取的值(如果没有等效的语法,则强制执行 SyntaxError)。对于没有支持供人阅读展示结果的对象, str() 返回与 repr() 相同的值。一般情况下,数字、列表或字典等结构的值,使用这两个函数输出的表现形式是一样的。字符串有两种不同的表现形式。
示例如下:
>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # The argument to repr() may be any Python object:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"string 模块包含 Template 类,提供了将值替换为字符串的另一种方法。该类使用 $x 占位符,并用字典的值进行替换,但对格式控制的支持比较有限。
二、字符串 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))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
也可以用 ‘**’ 符号,把 table 当作传递的关键字参数。
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
与内置函数 vars() 结合使用时,这种方式非常实用,可以返回包含所有局部变量的字典。
例如,下面的代码生成一组整齐的列,包含给定整数及其平方与立
>>> for x in range(1, 11):
... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...1 1 12 4 83 9 274 16 645 25 1256 36 2167 49 3438 64 5129 81 729
10 100 100
三、读写文件
第一个实参是文件名字符串。第二个实参是包含描述文件使用方式字符的字符串。mode 的值包括 ‘r’ ,表示文件只能读取;‘w’ 表示只能写入(现有同名文件会被覆盖);‘a’ 表示打开文件并追加内容,任何写入的数据会自动添加到文件末尾。‘r+’ 表示打开文件进行读写。mode 实参是可选的,省略时的默认值为 ‘r’。
>>> f = open('workfile', 'w', encoding="utf-8")
在文本模式下读取文件时,默认把平台特定的行结束符(Unix 上为 \n, Windows 上为 \r\n)转换为 \n。在文本模式下写入数据时,默认把 \n 转换回平台特定结束符。这种操作方式在后台修改文件数据对文本文件来说没有问题,但会破坏 JPEG 或 EXE 等二进制文件中的数据。注意,在读写此类文件时,一定要使用二进制模式。
在处理文件对象时,最好使用 with 关键字。优点是,子句体结束后,文件会正确关闭,即便触发异常也可以。而且,使用 with 相比等效的 try-finally 代码块要简短得多:
>>> with open('workfile', encoding="utf-8") as f:
... read_data = f.read()>>> # We can check that the file has been automatically closed.
>>> f.closed
True
如果没有使用 with 关键字,则应调用 f.close() 关闭文件,即可释放文件占用的系统资源。
警告: 调用 f.write() 时,未使用 with 关键字,或未调用 f.close(),即使程序正常退出,也可能 导致 f.write() 的参数没有完全写入磁盘。
四、文件对象的方法
本节下文中的例子假定已创建 f 文件对象。
f.read(size) 可用于读取文件内容,它会读取一些数据,并返回字符串(文本模式),或字节串对象(在二进制模式下)。 size 是可选的数值参数。省略 size 或 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='')
...
This is the first line of the file.
Second line of the file
如需以列表形式读取文件中的所有行,可以用 list(f) 或 f.readlines()。
f.write(string) 把 string 的内容写入文件,并返回写入的字符数。
>>> f.write('This is a test\n')
15
写入其他类型的对象前,要先把它们转化为字符串(文本模式)或字节对象(二进制模式):
>>> value = ('the answer', 42)
>>> s = str(value) # convert the tuple to string
>>> f.write(s)
18
f.tell() 返回整数,给出文件对象在文件中的当前位置,表示为二进制模式下时从文件开始的字节数,以及文本模式下的意义不明的数字。
f.seek(offset, whence) 可以改变文件对象的位置。通过向参考点添加 offset 计算位置;参考点由 whence 参数指定。 whence 值为 0 时,表示从文件开头计算,1 表示使用当前文件位置,2 表示使用文件末尾作为参考点。省略 whence 时,其默认值为 0,即使用文件开头作为参考点。
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
在文本文件(模式字符串未使用 b 时打开的文件)中,只允许相对于文件开头搜索(使用 seek(0, 2) 搜索到文件末尾是个例外),唯一有效的 offset 值是能从 f.tell() 中返回的,或 0。其他 offset 值都会产生未定义的行为。
五、使用 json 保存结构化数据
从文件写入或读取字符串很简单,数字则稍显麻烦,因为 read() 方法只返回字符串,这些字符串必须传递给 int() 这样的函数,接受 ‘123’ 这样的字符串,并返回数字值 123。保存嵌套列表、字典等复杂数据类型时,手动解析和序列化的操作非常复杂。
Python 支持 JSON (JavaScript Object Notation) 这种流行数据交换格式,用户无需没完没了地编写、调试代码,才能把复杂的数据类型保存到文件。json 标准模块采用 Python 数据层次结构,并将之转换为字符串表示形式;这个过程称为 serializing (序列化)。从字符串表示中重建数据称为 deserializing (解序化)。在序列化和解序化之间,表示对象的字符串可能已经存储在文件或数据中,或通过网络连接发送到远方 的机器。
只需一行简单的代码即可查看某个对象的 JSON 字符串表现形式:
>>> import json
>>> x = [1, 'simple', 'list']
>>> json.dumps(x)
'[1, "simple", "list"]'
dumps() 函数还有一个变体, dump() ,它只将对象序列化为 text file 。因此,如果 f 是 text file 对象,可以这样做:
json.dump(x, f)
python官方文档链接
python官方标准库链接
6、python基础:文件输入输出详解相关推荐
- Python 获取文件后缀详解
文章目录 1 概述 2 语法 3 扩展 3.1 os 模块详解 1 概述 #mermaid-svg-p01C6BlZHxzyBcdz .label{font-family:'trebuchet ms' ...
- python基础知识~ 函数详解2
python~函数详解2 1 生成器函数 定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数 须知 yield和return一样,都可以返回数 ...
- Python基础 列表的详解(纯干货)
Python基础 列表 目录 Python基础 列表 列表的用处 列表的创建 列表的特点 列表的操作 列表元素的查询操作- **获取列表中的元素的索引** 列表元素的增加操作 列表元素的删除 列表元素 ...
- load python txt文件_详解Python中numpy.loadtxt()读取txt文件
为了方便使用和记忆,有时候我们会把 numpy.loadtxt() 缩写成np.loadtxt() ,本篇文章主要讲解用它来读取txt文件. 读取txt文件我们通常使用 numpy 中的 loadtx ...
- 使用python下载文件_详解使用Python下载文件的几种方法
在使用Python进行数据抓取的时候,有时候需要保持文件或图片等,在Python中可以有多种方式实现.今天就一起来学习下. urllib.request 主要使用的是urlretrieve方法,该方法 ...
- 【Python基础】超级详解系列-Python列表全面解析
Python有6个内置的基本数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Set(集合).Dictionary(字典),列表可以算是最常见的数据类型.列 ...
- Python读写文件参数详解 open read write
一.打开文件 open方法 python打开一个文件用open()方法,返回一个文件对象,它是可迭代的: f=open('file.txt', mode='r') mode参数表示对文件的操作方式,读 ...
- Python基础循环语句详解(for、while)
*2.8 循环语句* 循环语句主要是两种,for循环和while循环,他们的主要用法和区别: for循环用于确定的次数,这样会比while循环更加简洁比如我要循环代码多少次,次数明确,适合用for. ...
- python average函数详解_python基础之函数详解
Python基础之函数详解 一.函数的定义 到现在为止,我们已经掌握了Python的基本语法和数据类型等相关基础知识了,以进行一个项目的编写了,这个时候,就会发现,很多代码需要我们进行复制粘贴,这简直 ...
- python setting.py_python基础教程:Django框架的中的setting.py文件说明详解
这篇文章主要介绍了Django框架的中的setting.py文件说明详解,这个文件包含了所有有关这个Django项目的配置信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.加载数据库,数据库 ...
最新文章
- [jobdu]调整数组顺序使奇数位于偶数前面
- 如何移植.NET Framework项目至.NET Core?
- Halcon:Image、region、xld常用的处理
- python 回归 显著_Python数分:回归分析
- ffmpeg图片缩放
- python oop示例_python 面向对象oop
- Ubuntu提示软件更新
- [VB]使用ADO Recordset对象导入Excel
- Day704.Tomcat内存溢出的原因分析及调优 -深入拆解 Tomcat Jetty
- 电脑清理(C盘清理,卸载软件以及注册表清理)
- Python网络爬虫:爬取腾讯招聘网职位信息 并做成简单可视化图表
- 【Rust 日报】2021-12-23 Rust有什么是Zig所没有的?
- python+opencv摄像头人脸检测+代码注释
- winSocket第一步WSAStartup
- html如何拉伸一个图片,css怎么拉伸图片?
- 解决清华大学校园网自动连接问题
- 自己能力还有待改善,介绍一下我自己
- 15秒,找到行业内最专业的内容,你想要吗
- qmail于redhat9安装记录(转)
- Whistle安装及使用指南
热门文章
- c# gerber文件读取_gerber文件查看器|gerber文件查看工具(GerbView)下载 v7.71 免费版 - 121下载站...
- pr如何处理音效_在pr中怎么让声音变的好听?pr怎么让说话的声音更好听?
- IT营Beego教程 Golang+Beego+Grom仿小米商城项目实战视频教程
- GoF的23种设计模式分类概念
- java社区团购微信小程序源码
- 视频教程| Egret 打包Android/iOS 原生游戏
- 51单片机带闹钟c语言程序,51单片机定时闹钟程序(带按键)
- tBERT部分代码(自学用)
- oracle查看视图定义语句_oracle中查询用户表/索引/视图创建语句
- 手动修改Icon图标的颜色深度(张佩)