前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础学习 Python 之文件(二)

零基础学习 Python 之文件(二)

作者头像
编程文青李狗蛋
发布2019-11-07 15:30:03
3050
发布2019-11-07 15:30:03
举报
写在之前

大家好,这里是零基础学习 Python 系列,在这里我将从最基本的Python 写起,然后再慢慢涉及到高阶以及具体应用方面。我是完全自学的 Python,所以很是明白自学对于一个人的考验,所以在这里我会尽我最大的努力,把 Python 尽可能简单的表述清楚,让更多想要学习 Python 的朋友能够入门。同时写这个教程也算是对自己之前所学知识的一个巩固和提高,喜欢的朋友们可以点个关注,有问题欢迎随时和我交流。本文所有的代码编写均是Python3 版本。

今天接着昨天的文章(零基础学习 Python 之文件(一))接着往下进行,除去我们昨天说以后再讲的,算是还剩下一点点比较有意思的点。

读取文件的内容

因为文件的对象是可迭代的,所以能够用open() 打开文件,所以用 for 循环可以将文件的内容读出来。我在前面的文章说过,可以用 dir() 查看文件对象的属性和方法,当你看了以后你会发现有 3 个方法 read / readline / readlines,单单从名称上看,它们应该和读有关系,事实上确实是这样的,但是它们 3 个又有些微的差别。

1.read()

文件对象的 read() 方法,其实完整的写出来其实是 read( size ),只不过里面的参数可以省略,如果不省略,则读取文件中的 size 个字符并返回一个字符串;如果省略的话,则读取文件对象的字符知道 EOF,EOF == End - of - file。

代码语言:javascript
复制
>>> f = open('new.txt')
>>> f.read(10)
'this is a '
>>> f.read()
'new filewith is good good good.’

如果你是按照上述的例子依次进行操作的,就会在 f.read() 后出现上述的结果,这主要是因为在前面已经 read(12) 了,指针已经移动到了第 12 个字符后面。

2.readline() & readlines()

readline() 就是它表面的意思,逐行读取文件的内容。

代码语言:javascript
复制
>>> f = open('new.txt')
>>> f.readline()
'this is a new filewith is good good good.'
>>> f.readline()
''

每次执行 readline() 的时候它只读一行,直到最后一行,如果还执行 readline() 的话,它不会报错,返回的是空字符串。

同样也是有 readline(size) 的,如果给 readline(size) 参数,则读取相应行的 size 个字符,有兴趣的可以自己试一下。

还有一个是 readlines(),它的作用是将文件中各行读出来,放到一个列表中返回。

代码语言:javascript
复制
>>> f = open('test.txt')
>>> f.readlines()
['My name is Rocky\n', 'I love Python’]

既然返回的是一个列表,那么就能用 for 循环读取列表元素,再观察一下可以发现,列表中的每个元素都是文件的一行,并且是字符串。

代码语言:javascript
复制
>>> f = open('test.txt')
>>> for line in f.readlines():
...     print(line)
... 
My name is Rocky

I love Python

这个是不是让你想起了昨天的文章中对文件的 for 循环?

代码语言:javascript
复制
>>> f = open('test.txt')
>>> for line in f:
...     print(line)
... 
My name is Rocky

I love Python

乍一看两种方式好像没有什么区别,其实这两种方式是不同的。在 for line in f 中,并没有将文件中所以的行都读入内存,而 for line in f.readlines() 中先执行了 f.readlines(),在内存中有一个列表,列表中包含了所有文件的行,这就是两种方式的区别。

大文件的读取

上面的三个读取文件内容的方法 read 和 readlines 都是一次性将全部的内容读入内存,如果文件不是很大的话,这种做法能够保证读取的速度,但是如果文件内容很大,大到差不多内存那么大或者更大的时候,就不能这么做了。但是 Python 早就替你考虑到了,Python 中有一个 fileinput 模块,可以使用它来操作。

代码语言:javascript
复制
>>> import fileinput
>>> for line in fileinput.input('test.txt'):
...     print(line,end = '')
... 
My name is Rocky
I love Python

因为我没有大的文件,只是为了演示一下这个模块的用法,对于这个模块更多的内容,可以在交互模式下用 dir() 去查看。

seek

不知道你有没有奇怪过在之前的演示中,每次都要做 f = open(‘***’) 类似的操作,否则就会出现下面的情况:

代码语言:javascript
复制
>>> f = open('test.txt')
>>> for line in f:
...     print(line)
... 
My name is Rocky

I love Python
>>> for line in f:
...     print(line)
... 
>>>

是不是发现,当我们第二次循环文件的时候,既没有报错,也没有显示文件的内容,类似的现象在前面的 readline 中也出现过,这是因为读取文件的时候,有指针随着运动,当读取结束时,指针就到了相应的位置。

当指针结束运动时,可以使用 tell() 告诉我们当前指针的位置。

代码语言:javascript
复制
>>> f = open('test.txt')
>>> f.readline()
'My name is Rocky\n'
>>> f.tell()
17

现在我们来看 seek() 的能力,它能够根据偏移量来移动指针。

代码语言:javascript
复制
>>> f.seek(0)
0

上面的意思是将指针移动到文件的开始,如果用 f.readline() 读取的话,现在输出的应该是文件的第一行:

代码语言:javascript
复制
>>> f.readline()
'My name is Rocky\n’

其实还可以操纵指针到任何一个位置,请看下面的操作:

代码语言:javascript
复制
>>> f.seek(10)
10
>>> f.tell()
10

f.seek(10) 就是将位置定位到从开头算起到第 10 个字符后面,这时候如果使用 readline 的话,读取的是从当前位置到行末的字母。

写在之后

文件讲完了,我们不只一次在这两篇文章以及前面的文章中提到过「迭代」这个词,文件是可迭代的,我们之前还讲过其它可迭代的对象,所以迭代是一个我们必须要讨论的知识点,明天敬请期待。

最后感谢你能看到这里,希望我写的东西能够让你有到收获,但是我还是希望我在文章里插入的代码,你们能自己动手试一下,都很简单。原创不易,每一个字,每一个标点都是自己手敲的,所以希望大家能多给点支持,该关注关注,该点赞点赞,该转发转发,有什么问题欢迎在后台联系我,也可以在公众号找到我的微信加我。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python空间 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档