Python入门第二十课--文件和流

1.前言

    从这节开始,我们开始进行与外部的交互。前面的内容都是和Python解释器内部的数据结构打交道,而文件和流可以让我们获得外部的一些数据,在这里介绍的函数和对象可以让你在程序调用时存储数据,并且可以处理来自其他程序的数据。

2.文件和流

2.1基本文件处理

    open函数用来打开文件,它具体的语法是这样的:open(name[, mode[, buffering]])

open函数使用一个文件名作为唯一的参数,也是强制参数,然后返回一个文件对象。mode(模式)和buffering(缓冲)参数都是可选的。

如果open函数只带一个文件名参数,那么我们可以获得能读取文件内容的文件对象。如果要向文件里面写入内容,则需要提供一个模式参数。下表为open函数中模式参数的常用值,可以很容易的理解它们的意思。

描述
'r' 读模式
'w' 写模式
'a' 追加模式
'b' 二进制模式,可添加到其他模式使用
'+' 读/写模式,可添加到其他模式使用
open函数的第三个参数控制着文件的缓冲。如果是0或者是False,则表示I/O是没有缓冲的。如果是1或者是True,I/O就会有缓冲。没有缓冲的时候,所有的读写操作都是对于硬盘而言的,而又缓冲的时候意味着Python用内存来代替硬盘,让程序更快。而且只有在使用flush和close的时候才会更新硬盘,大于1的数字表示缓冲区的大小,-1代表使用默认的缓冲区大小。

2.2基本的文件方法

    打开文件的操作就是这样的,打开文件后我们就要对它进行一些操作,也就是下面介绍的一些基本的文件方法。

  • 读和写操作
>>> f=open('somefile.txt','w')
>>> f.write('Hello, ')
7
>>> f.write('World, ')
7
>>> f.close()
>>> f=open('somefile.txt','r')
>>> f.read(4)
'Hell'
>>> f.read()
'o, World, '

    文件最重要的能力是提供或者接收数据。就如上面的例子一样,如果有一个名为f的类文件对象,那么久可以用f.read方法和f.write方法读取和写入数据。从上面的例子可以很清楚的看到。

  • 管式输出

来看一个这样的例子:cat somefile.txt | python somescript.py | sort

这个管道由以下3个命令组成:

  • cat somefile.txt :只是把somefile.txt的内容写到标准输出,标准输出也就是(sys.stdout)
  • python somescript.py:这个命令运行了python脚本somescript,脚本应该是从标准输入读,把结果写入标准输出。
  • sort:这条命令从标准输入(sys.stdin)读取所有的文本,按字母排序,然后把结果写入标准输出。

而例子中的 | 管道符号的作用是将一个命令的标准输出和下一个命令的标准输入连在一起。

  • 读写行

通常来说,逐个字符读取文件也是没有问题的,进行逐行的读取也可以。还可以使用file.readline读取单独地一行,从当前的位置开始直到一个换行符出现,也读取这个换行符。不使用任何参数或使用一个非负的整数作为readline可以读取的字符的最大值。readlines方法可以读取一个文件中所有的行并将其作为列表返回。

writelines方法和readlines相反:传给它一个字符串的列表,它会把所有的字符串写入文件,但是程序不会增加新行,需要自己添加。没有writeline方法,因为能使用write。

2.3关闭文件

    我们要牢记用close方法关闭文件。通常来说,一个文件对象在退出程序后自动关闭,尽管是否关闭文件不是很重要,单关闭文件是没有害处的,可以避免在某些操作系统或设置中进行无用的修改,这样做也会避免用完系统中所打开文件的配额。

    写入过的文件总是应该关闭,是因为配一体化可能会缓存,出于效率的考虑而把数据临时地存储在某处,通过缓存写入的数据如果因为程序某些原因而崩溃了,那么数据根本就不会被写入文件。为了安全起见和一些不为人知的原因,要在使用完文件后关闭。

2.4对文件内容进行迭代

  • 按字节处理

最常见的对文件内容迭代的方法就是在while循环中使用read方法,来看看下面这样的处理方法:

def process(string):
    print 'Processing: ', srting
    
    
f=open(filename)
while True:
    char=f.read(1)
    if not char:break
    process(char)
f.close()

其中filename是你自己的文件名字,在循环中我们可以将文件里面的内容按字节处理。

  • 按行操作

当处理文本文件的时候,经常会对文件的行进行迭代而不是处理单个字节。处理行使用的方法和处理字符一样,即使用readline方法:

def process(string):
    print 'Processing: ', srting


f=open(filename)
while True:
    char=f.readline()
    if not char:break
    process(line)
f.close()
  • 读取所有内容

如果文件不是很大,那么可以使用不带参数的read方法一次读取整个文件,或者readlines方法:

def process(string):
    print 'Processing: ', srting


f=open(filename)
for char in f.read()
    process(char)
f.close()

或者:

def process(string):
    print 'Processing: ', srting


f=open(filename)
for line in f.readlines()
    process(line)
f.close()

这些方法都是可以实现的,但是你有没有考虑到在需要对一个非常打的文件进行迭代的操作时,readlines会占用太多的空间,这个时候可以用while循环和readline方法来代替,如果能使用for循环就更好了。到这里就是要展现真正技术的时候了,从Python2.2开始文件对象是可迭代的,这就是意味着可以直接在for循环中使用它们,从而实现对它们的迭代。是这样的:

def process(string):
    print 'Processing: ', srting


f=open(filename)
for line in f
    process(line)
f.close()

代码看起来比上面的一些更简洁、更优雅。

好了,到这里基本的文件和流操作就已经完成了,记住和掌握里面关键部分就可以。至此,Python中基础的部分也就到这里就介绍的差不多了,后面的内容会带有一些综合性和复杂性。下一章节预告-图形用户界面GUI。


猜你喜欢

转载自blog.csdn.net/qq_34454366/article/details/80723386