目录

  • 打开/建立文件
  • 读取文件
  • 写入文件
  • 小结
  • References

我们平时在做数据处理时,常常只需通过类似 pandas.read_csv 这样的高层命令就可以方便地把磁盘中的文件读取为 Python 的数据结构。但我们有必要掌握 Python 到底是怎样操作文件的。

在程序运行时,数据保存在内存的变量里。内存中的数据在程序结束或关机后就会消失。如果想要在下次开机运行程序时还使用同样的数据,就需要把数据存储在不易失的存储介质中,例如硬盘、光盘或 U 盘。而不易失存储介质上的数据保存在以路径命名的文件中。通过读写文件,程序就可以在运行时保存数据。

在 Python 中操作文件通常按照以下 3 个步骤进行:

  1. 使用 open() 函数打开或建立一个文件,返回一个文件句柄
  2. 使用文件句柄的读写方法对文件进行读写操作
  3. 使用 close() 函数关闭文件

打开/建立文件

如果想要打开某个文件进行读写操作,可以使用内置函数 open,参数可以为绝对路径或者相对路径:

path = 'A Game of Thrones.txt' # 这里使用相对路径
f = open(path)

默认情况下,文件以只读模式 r 打开。之后,我们可以把文件句柄 f 当作一个列表 (准确来说,它代表 Python Shell 与磁盘上文件之间的连接)。例如,我们可以这样遍历文件的行:

for line in f:pass
lines = [x.rstrip() for x in open(path, encoding='utf-8')]
lines
"""
Out: ['PROLOGUE','We should start back,” Gared urged as the woods began to grow dark around them.','','“The wildlings are dead.”','','“Do the dead frighten you?” Ser Waymar Royce asked with just the hint of a smile.','','Gared did not rise to the bait. He was an old man, past fifty, and he had seen the lordlings come andgo. “Dead is dead,” he said. “We have no business with the dead.”','','“Are they dead?” Royce asked softly. “What proof have we?”','',...]
"""

rstrip() 删除 string 字符串末尾的指定字符,默认为空白符,包括空格、换行符、回车符、制表符。

当我们完成对文件的操作之后,要记得关闭文件,释放资源:

f.close()

如果觉得自己记不住手动关闭文件,可使用 with 语句:

with open(path) as f:lines = [x.rstrip() for x in f]

当退出 with 语句后文件会被自动关闭。

除了默认的只读 r 模式,我们还可以用许多其它模式来打开一个文件:

Mode Description
r read-only mode
w write-only mode; 如果文件不存在则创建一个新文件,否则覆盖原文件
x write-only mode; 如果原文件已经存在,则会报错
a 追加模式,打开文件用于在末尾追加内容,如果文件不存在,则创建一个新文件
+ read and write,与其他模式结合使用
b 与其它模式结合使用,例如 rb 表示以二进制格式打开文件用于只读

不同模式可以相互组合。从上表中我们应该能推出组合模式的功能。例如,rb+ 表示以二进制格式打开一个文件用于读写;wb+ 也表示以二进制格式打开一个文件用于读写,但如果该文件不存在则创建一个新文件,否则覆盖原文件。


读取文件

对于可读文件,有几个最常用的方法,例如 readreadlines

read 从文件中返回一定数量的字符,如果不指定数量,则将整个文件的内容读取为一个字符串。字符的构成是由文件的编码方式决定的:

path = 'A Game of Thrones.txt'
f = open(path, encoding='utf-8')
f.read(20)
"""
Out: 'PROLOGUE\nWe should s'
"""
path = 'A Game of Thrones.txt'
f2 = open(path, 'rb')
f2.read(20)
"""
Out: b'PROLOGUE\r\nWe should '
"""

read 方法根据读取的字节数,将当前指针的位置不断前移。tell 方法告诉我们当前指针的位置:

f.tell()
"""
Out: 21
"""
f2.tell()
"""
Out: 20
"""

UTF-8 是长度可变的 Unicode 编码,因此当我们从文件中读取指定数量的字符时(上例中 20),最少 20 字节可能就能对这些字符解码,但也有可能多达 40 字节。所以我们观察到指针的位置并不是 20。指针计算的是偏移的字节数。而当使用二进制格式时,字节数和字符数是完全匹配的。

readline 方法从文件中获取一个字符串,每个字符串就是文件中的一行。

readlines 方法返回一个字符串列表,其中的每一项是文件中每一行的字符串。

read 方法一样,readline 方法和readlines 方法也可以设置参数,指定一次读取的字符数。

我们还可以用 seek 方法来改变当前指针的位置:

f.seek(3)
f.read(1)
"""
Out: 'L'
"""

文件对象将缓冲区视为一个大的列表,其中的每一个元素都有自己的索引,文件对象按字节对缓冲区索引计数。许多方法隐式使用当前位置。例如在调用 readline() 方法后,文件当前位置移动到下一个回车处。

如果是在对非二进制格式的文件进行操作时,一定要注意 seek 的使用。如果指针位置恰好落在定义某个 Unicode 字符的字节流中间,那么接下来的读取会发生错误。

最后别忘记关闭文件!

f.close()
f2.close()

写入文件

往文件中写入内容,可使用 write 或者 writelines 方法。例如我们在一个新文件中写入之前文件内容的无空行版本:

with open('tmp.txt', 'w') as handle:handle.writelines(x for x in open(path, encoding='utf-8') if len(x) > 1)
with open('tmp.txt') as f:lines = f.readlines()
lines
"""
Out: ['PROLOGUE\n','We should start back,” Gared urged as the woods began to grow dark around them.\n','“The wildlings are dead.”\n','“Do the dead frighten you?” Ser Waymar Royce asked with just the hint of a smile.\n','Gared did not rise to the bait. He was an old man, past fifty, and he had seen the lordlings come andgo. “Dead is dead,” he said. “We have no business with the dead.”\n','“Are they dead?” Royce asked softly. “What proof have we?”\n',...]
"""

小结

下表总结了一些读写文件时常用的方法:

Method Description
read([size]) 以字符串形式从文件中读取数据,可选参数 size 指明要读取的字符数
readlines([size]) 返回文件每行内容的列表,可选参数 size 指明要读取的字符数,返回的内容最少为一行
write(str) 向文件写入字符,如需换行需手动加入换行符
writelines(strings) 向文件写入一个序列字符串列表,如需换行需手动加入换行符
flush() 将内部I/O缓冲区刷新到磁盘
seek(pos) 将指针移动到指定位置,pos 为整数
tell() 返回目前文件指针的位置
closed True 如果文件已经关闭

关于 flush()

open 函数还有一个参数 buffering,用来控制缓冲。当该参数取 0 或 False 时, I/O 是无缓冲的,所有读写操作直接针对硬盘。当该参数取 1 或 True 时, I/O 有缓冲,此时 Python 使用内存代替硬盘,使程序的运行速度更快,只有在使用 flush()close() 时才会将数据写入硬盘。当参数大于 1 时,表示缓冲区的大小,以字节为单位。

Python 没有二进制类型,但是可以用 string 类型来存储二进制类型数据,因为 string 是以字节为单位的。


References

[1] Python for Data Analysis, 2 n d ^{\rm nd} nd edition. Wes McKinney.

[2] 《Python 项目案例开发:从入门到实战》,郑秋生、夏敏捷主编。

Python 文件读写、文件内移动相关推荐

  1. python怎么读取文件-python怎么读写文件操作

    本节内容:I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input/ ...

  2. python怎么读写文件-python怎么读写文件操作

    本节内容:I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input/ ...

  3. python在读写文件之前需要创建文件对象-python基础教程:文件读写

    在Linux系统中,一切都是文件.但我们通常说的文件是保存在磁盘上的图片.文档.数据.程序等等.而在程序的IO操作中,很多时候就是从磁盘读写文件.本节我们讲解Python中的文件对象如何操作文件. 创 ...

  4. python pprint_python读写文件(七)

    今天分享读写文件里面的用 pprint.pformat()函数保存变量 ,分享完这个,读写文件就算是全部结束了. pprint.pprint()函数将列表或字典中的内容"漂 亮打印" ...

  5. python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...

    文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...

  6. python怎么读写文件-Python 文件I/O

    Python 文件I/O 本章只讲述所有基本的 I/O 函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把 ...

  7. 编程中python怎么读-编程语言如何在Python中读写文件

    从文件读取和写入文件是任何编程语言的常见需求.任何文件在读写之前都需要打开.大多数编程语言都使用open()方法来打开文件,以便使用文件对象(file object)读写.可以使用不同类型的文件访问模 ...

  8. python如何读写文件-Python读写文件

    python读写文件是很常见的操作,而多数情况下是对纯文件的读写操作. 我们先看一下,纯文本是如何进行读写操作的. """ created by nzh Date: 20 ...

  9. 【Python】读写文件的操作

    编程语言中,我们经常会和文件和文件夹打交道,这篇文章主要讲的是Python中,读写文件的常用操作: 一.打开文件 openFile = open('../Files/exampleFile.txt', ...

  10. python怎么读写文件-python怎么读取文件内容

    Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出OSError的错误. 完整的语法格式为:(推荐学习:Pytho ...

最新文章

  1. linux查看流量开源,Linux流量监控工具 - iftop
  2. vmware 共享文件夹(win10下的vmware安装了centos7)
  3. 好的开始是成功的一半:网页优化之标题篇
  4. SpringMVC无法获取请求中的参数的问题的调查与解决(1)
  5. [Head First设计模式]生活中学设计模式——迭代器模式
  6. tableau可视化函数使用案例(六十七)-Tableau饼图及其变种(环形图、南丁格尔玫瑰图、旭日图)
  7. 前端学习(688):断点调试
  8. 计算机网络画出发送窗口变化,全国2010年7月自考计算机网络原理试题及答案
  9. NPM使用前设置和升级
  10. windows 服务实现定时任务调度(Quartz.Net)
  11. Cowboy 源码分析(二十六)
  12. 【美学集】色彩之冷暖色
  13. 堆栈stack的基本操作
  14. jquery解绑、绑定笔记
  15. 64位操作系统注册ocx控件失败,提示:模块加载失败请确保该二进制存储在指定路径中。
  16. 强化练习200题(二) 本卷共200道试题作答时间为240分钟,总分200分,120分及格
  17. OMAP 3 图像信号处理器 (ISP) 驱动
  18. CWnd::SetCapture, ReleaseCapture, GetCapture
  19. 学习MySQL的第一步:安装MySQL及数据库可视化工具Navicat
  20. 一份标准的软件测试计划文档 | 新手可以拿走

热门文章

  1. halcon算子翻译——get_framegrabber_param
  2. 34. GameProject5
  3. 社保管理客户端显示服务器异常,必看!社保管理客户端的5个热点问题解答
  4. 论文解读《Relevance-CAM: Your Model Already Knows Where to Look》–阅读笔记
  5. 惠普linux进入bios设置u盘启动,惠普笔记本如何设置u盘启动_惠普hp进入bios设置u盘启动的方法...
  6. [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构
  7. 【TypeScript】TS安装与使用
  8. 腾讯破局区块链,先在供应链金融做好标杆
  9. UCloud杨镭:贴近用户需求做研发,将“云”简单化...
  10. Spring Boot从入门到精通(超详细)