写在之前
大家好,这里是零基础学习 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。
>>> 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() 就是它表面的意思,逐行读取文件的内容。
>>> 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(),它的作用是将文件中各行读出来,放到一个列表中返回。
>>> f = open('test.txt')
>>> f.readlines()
['My name is Rocky\n','I love Python’]
既然返回的是一个列表,那么就能用 for 循环读取列表元素,再观察一下可以发现,列表中的每个元素都是文件的一行,并且是字符串。
>>>f = open('test.txt')
>>>forlineinf.readlines():
...print(line)
...
My nameisRocky
I love Python
这个是不是让你想起了昨天的文章中对文件的 for 循环?
>>>f = open('test.txt')
>>>forlineinf:
...print(line)
...
My nameisRocky
I love Python
乍一看两种方式好像没有什么区别,其实这两种方式是不同的。在 for line in f 中,并没有将文件中所以的行都读入内存,而 for line in f.readlines() 中先执行了 f.readlines(),在内存中有一个列表,列表中包含了所有文件的行,这就是两种方式的区别。
大文件的读取
上面的三个读取文件内容的方法 read 和 readlines 都是一次性将全部的内容读入内存,如果文件不是很大的话,这种做法能够保证读取的速度,但是如果文件内容很大,大到差不多内存那么大或者更大的时候,就不能这么做了。但是 Python 早就替你考虑到了,Python 中有一个 fileinput 模块,可以使用它来操作。
>>>importfileinput
>>>forlineinfileinput.input('test.txt'):
...print(line,end ='')
...
My nameisRocky
I love Python
因为我没有大的文件,只是为了演示一下这个模块的用法,对于这个模块更多的内容,可以在交互模式下用 dir() 去查看。
seek
不知道你有没有奇怪过在之前的演示中,每次都要做 f = open(‘***’) 类似的操作,否则就会出现下面的情况:
>>>f = open('test.txt')
>>>forlineinf:
...print(line)
...
My nameisRocky
I love Python
>>>forlineinf:
...print(line)
...
>>>
是不是发现,当我们第二次循环文件的时候,既没有报错,也没有显示文件的内容,类似的现象在前面的 readline 中也出现过,这是因为读取文件的时候,有指针随着运动,当读取结束时,指针就到了相应的位置。
当指针结束运动时,可以使用 tell() 告诉我们当前指针的位置。
>>> f = open('test.txt')
>>> f.readline()
'My name is Rocky\n'
>>> f.tell()
17
现在我们来看 seek() 的能力,它能够根据偏移量来移动指针。
>>> f.seek(0)
上面的意思是将指针移动到文件的开始,如果用 f.readline() 读取的话,现在输出的应该是文件的第一行:
>>> f.readline()
'My name is Rocky\n’
其实还可以操纵指针到任何一个位置,请看下面的操作:
>>> f.seek(10)
10
>>> f.tell()
10
f.seek(10) 就是将位置定位到从开头算起到第 10 个字符后面,这时候如果使用 readline 的话,读取的是从当前位置到行末的字母。
写在之后
文件讲完了,我们不只一次在这两篇文章以及前面的文章中提到过「迭代」这个词,文件是可迭代的,我们之前还讲过其它可迭代的对象,所以迭代是一个我们必须要讨论的知识点,明天敬请期待。
最后感谢你能看到这里,希望我写的东西能够让你有到收获,但是我还是希望我在文章里插入的代码,你们能自己动手试一下,都很简单。原创不易,每一个字,每一个标点都是自己手敲的,所以希望大家能多给点支持,该关注关注,该点赞点赞,该转发转发,有什么问题欢迎在后台联系我,也可以在公众号找到我的微信加我。
The end。
扫下面来一波关注。。
领取专属 10元无门槛券
私享最新 技术干货