摘要:在系统中,一切都是文件。第二个参数也是一个字符串,表示文件使用方式。是文本模式下读写文件。在使用创建文件对象时,最好使用关键字。其好处是,当字句体结束后文件会正确关闭,即使在某个时刻引发了异常。
在Linux系统中,一切都是文件。但我们通常说的文件是保存在磁盘上的图片、文档、数据、程序等等。而在程序的IO操作中,很多时候就是从磁盘读写文件。本节我们讲解Python中的文件对象如何操作文件。
创建文件对象通过Python内置函数open()可以很容易的创建一个文件对象。open函数有很多参数,最常用的有两个,使用open函数最常用的方法是:open(filename, mode)。
f = open("myfile", "w")
第一个参数filename是文件名的字符串,比如myfile。第二个参数也是一个字符串,表示文件使用方式。mode的可选项如下:
mode | 含义 |
---|---|
‘r’ | 以只读模式打开(默认) |
‘w’ | 以可写模式打开,并清楚文件内容(如果文件存在的话) |
‘x’ | 创建一个新文件并以可写模式打开 |
‘a’ | 以可写模式打开,从文件末尾开始写入(如果文件存在的话) |
‘b’ | 二进制模式 |
‘t’ | 文本模式(默认) |
’+’ | 打开一个已存在文件以便进行更新(读和写) |
其中的"b"和"t"是指定文件内容是文本还是二进制,其它都说是关于读写方式的。
"b"是二进制模式打开文件,读写的数据都是字节对象(bytes),这个模式可以读写一切文件,包括文本文件,但读写文本文件时要注意编码的问题。
"t"是文本模式下读写文件。读取时,默认会把平台特定的行结束符 (Unix 上的
, Windows 上的
)转换为
。写入是,默认会把出现的
转换回平台特定的结束符。这种默认的“幕后修改”对文本文件来说没有问题,但会破坏二进制数据(比如,JPEG或exe)文件中的数据。
在使用open创建文件对象时,最好使用 with 关键字。其好处是,当字句体结束后文件会正确关闭,即使在某个时刻引发了异常。并且with比等效的try-finally代码块更简短:
In [102]: with open("myfile") as f: ...: data = f.read() ...: In [103]: f.closed Out[103]: True
如果没使用with关键字,就要调用f.close()来关闭文件并立即释放它使用的系统资源。如果没有显示的关闭文件,Python的垃圾回收器最终将销毁该对象并为你关闭打开的文件,但这个文件可能会保持打开状态一段时间。另外一个风险是不同的Python实现会在不同的时间进行清理。
通过 with 语句或者调用 f.close() 关闭文件对象后,尝试使用该文件对象将自动失败。
文件对象的方法通过上面的方法创建文件对象f后,,我们就可以通过其对应的方法读写数据了。
(1)写内容到文件:f.write(string)
把内容写入文件的方法是write()方法,传递的对象必须是字符串(文本模式下)或字节对象(二进制模式下)。如果要写入其它类型的对象(比如,字典、列表等等),就要先把它们转换成字符串(文本模式下)或字节对象(二进制模式下)。
In [109]: f = open("myfile", "w") In [110]: f.write("认真学Python,就是文件的全部内容。 ") Out[110]: 21 In [111]: f.close()
(2)读取文件内容:f.read(size)
它会读取文件里面的数据并将其返回为字符串(在文本模式下),或者字节对象(二进制模式)。参数size是一个可选的整数参数,当size被省略或为负的时候,读取文件的全部内容;如果文件的大小是机器内存的两倍或更大,那么可能出现错误。读取并返回的size大小的内容。如果已经读完全部内容(到达文件末尾),将返回一个空字符串。
In [112]: f = open("myfile") In [113]: f.read() Out[113]: "认真学Python,就是文件的全部内容。 " In [114]: f.read() Out[114]: ""
f.readline() 从文件读取一行,换行符
留住字符串末尾;
f.readlines() 读取文件所有行,返回一个字符串的列表;
In [118]: f.readline() Out[118]: "认真学Python,就是文件的全部内容。 " In [119]: f.seek(0) Out[119]: 0 In [120]: f.readlines() Out[120]: ["认真学Python,就是文件的全部内容。 "]
遍历文件的所有行,也可以用遍历文件对象的方式,这是内存高效、快速并简单的方式:
In [122]: for line in f: ...: print(line) ...: 认真学Python,就是文件的全部内容。
(3)文件对象的位置
前面的例子中,我们已经读到文件的末尾,如果要再从头读的话就要调用f.seek(0)来设置文件对象的位置到文件开头。这个方法有两个参数:f.seek(cookie, whence=0)
cookie 是位置偏移量
whence 是相对位置,它有三种相对位置:
0 文件开头,偏移量是0或整数;
1 当前位置,偏移量可以是负数;
2 文件末尾,偏移量通常是负数;
如何查看当前位置呢?调用f.tell()方法。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43811.html
摘要:创建第一个协程推荐使用语法来声明协程,来编写异步应用程序。协程两个紧密相关的概念是协程函数通过定义的函数协程对象调用协程函数返回的对象。它是一个低层级的可等待对象,表示一个异步操作的最终结果。 我们讲以Python 3.7 上的asyncio为例讲解如何使用Python的异步IO。 showImg(https://segmentfault.com/img/remote/14600000...
摘要:并发的方式有多种,多线程,多进程,异步等。多线程和多进程之间的场景切换和通讯代价很高,不适合密集型的场景关于多线程和多进程的特点已经超出本文讨论的范畴,有兴趣的同学可以自行搜索深入理解。 编程中,我们经常会遇到并发这个概念,目的是让软件能充分利用硬件资源,提高性能。并发的方式有多种,多线程,多进程,异步IO等。多线程和多进程更多应用于CPU密集型的场景,比如科学计算的时间都耗费在CPU...
摘要:比如,模块名表示包中名为的子模块。例如,文件可以包含以下代码定义了之后,就会把,,导入到当前命名空间。这种导入使用前导点来指示相对导入中涉及的当前包和父包。也就是说被执行的主程序里面不能包含相对导入。 包,Package,是一种Python模块的集合,从文件组织形式上看,包就是一个文件夹,里面放着各种模块(.py文件),也可以有子文件夹(子包)。包名构建了一个Python模块的命名空间...
摘要:默认情况下,它也是不安全的,如果数据是由黑客精心设计的,则反序列化的数据可能被植入恶意代码。总结为我们提供了数据序列化的工具。如果是自己内部使用,可以作为一个选择进行复杂对象的序列化。 上一节我们学习了文件的读写,把一个字符串(或字节对象)保存到磁盘是一件很容易的事情。但是在实际编程中,我们经常需要保存结构化数据,比如复杂的字典、嵌套的列表等等,这时候就需要我们想办法把这些结构化数据先...
阅读 2617·2021-09-28 09:36
阅读 2228·2021-09-07 09:58
阅读 1491·2019-08-26 13:53
阅读 1275·2019-08-23 17:53
阅读 3023·2019-08-23 15:34
阅读 1849·2019-08-23 15:34
阅读 2863·2019-08-23 12:04
阅读 3717·2019-08-23 10:56