第十一章 文件和流

来源:互联网 发布:如何卸载mysql服务 编辑:程序博客网 时间:2024/06/07 02:49

11.1 打开文件   open( name[   ,mode[  ,  buffering]])

mode模式 ,   buffering   缓冲
函数返回一个文件对象    (所有文件对象都是可迭代的)

11.1.1 文件模式

 access_mode:文件使用模式,在open函数中默认为只读。其他模式还有:

        w:打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

        a(append):以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。 

        r+:以读写模式打开该文件必须存在。 

        w+:以读写模式打卡,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 

a+:以读/追加写方式打开一个文本文件。若文件不存在,则新建一个文本文件

        rb(binary):以二进制读模式打开

        wb:以二进制写模式打开

        ab:以二进制追加模式打开

        rb+:以二进制读写模式打开

        wb+:以二进制读写模式打开

        ab+:以二进制追加模式打开

  关于二进制模式

python用文本模式打开文件时,会转化换行符,以保证程序的跨平台使用。这就导致了问题,当使用二进制文件时,再使用文本模式打开可能会破坏二进制数据。此时应该使用二进制模式打开。

(或者可以在模式参数中使用   U    参数,能在打开文件时使用通用的换行符支持模式,此模式下,所有的换行符都将被转换成\n,不必考虑运行的平台)


11.1.2   缓冲(buffer)

0 (或者False) I/O(输入输出)就是无缓冲的(所有读写操作直接针对硬盘)

1(True):I/O   有缓冲,python使用内存代替硬盘,使程序更快  。当  使用   flush    或者   close  时才会更新硬盘的数据

大于1:表示缓冲区的大小(字节)

-1(或者任何负数):表示使用默认的缓冲区大小


11.2  基本文件方法

文件对象  和一些   类文件对象 (有时也叫流)(是指支持一些 file  类方法的对象:最重要的是支持 read和write方法,比如           sys.stdin   sys.stdout   sys.stderr等)   的基本方法

另外,本章的例子都把文件当成流来操作,也就是说只能按从头到尾的顺序读数据。
但是,其实可以使用类文件对象的方法    seek()和tell()   来随意移动读取位置(称为随机访问

f=open()       file()    (open是file的别名)对象常用的方法

read():读取字符串,告诉流要读多少字节  read(4)   ,不填就是全读

write():将字符串写入文件(追加到文件中以有字符的后面),写入对象为字符串

close():关闭文件,这样缓存才会写入磁盘(flush)

readline():读取文件单独的一行,从当前位置直到换行符的出现,包括行结束符。可加入一个非负参数,限定readline可读取的字符的最大值

readlines():读取一个文件的所有行,并作为列表返回

writelines():与readlines 相反,将列表写入文件,对象是列表。注意:程序不会自己添加换行符,要自己加(window系统下,\r\n和\n都可以)

随机访问:

seek(offset[,whence]):   把当前读写位置,移动到由offset和whence定义的位置   ,offset类是一个  字节数  ,表示偏移量。whence(默认为0)表示偏移量是从文件头开始计算的(offset必须非负)  whence为1 ,表示相对于当前位置移动,此时offset  可负 。    2表示相对文件结尾移动

tell():返回当前文件指针的位置


***11.2.2管式输出   (UNIX 的 shell中)

使用管道可以在一个命令后面续写其他的多个命令

$ cat somefile.txt | python somescript.py | sort

在window dos中

type somefile.txt | python somescript.py | sort     

(type 对应cat)


管道符号(|)将一个命令的标准输出和下一个命令的标准输入连在一起了

比如这里,somefile.txt 就作为somescript的   sys.stdin 


11.2.3  读写行

readline ;  readlines  ;  writelines  ; 见上


11.2.4   关闭文件

还有flush方法
尽管,文件对象在退出程序后会自动关闭。但最好还是自己关。因为有时候可能程序会崩溃,而这时候修改的数据可能还在缓存里,这样数据就不会写进文件内了。
为了总是关闭文件,可以使用 
try  /    finally  语句  使得在程序奔溃的情况下也会关闭文件

还可以使用专门为此设立的         with 语句

with open('somefile.txt') as somefile:            do_something(somefile)

with语句打开文件,并且将其赋值到变量 somefile上 。之后就可以对文件进行操作
重要的是,文件在语句结束后会被自动关闭,即使是由于异常引起的结束

with还可以使用所谓的上下文管理器(一种支持__enter__和__exit__这两种方法的对象)(p213  具体去看python文档)


11.3  对文件内容进行迭代

除了使用上面说的方法,还可以用        xreadlines         和           文件迭代器 
  
11.3.1   按字节处理
process表示打印字符
经过检验  在换行处,process会输出一个换行字符  
f=open(filename)         #一个字符一个字符的读取while True:    char=f.read(1)    if not char:break    process(char)f.close()

11.3.2     按行操作

这里也是,在输出时,每个process会空一行,最后一行除外(因为没有换行符)
f=open(filename)while True:    line=f.readline()    if not line:break    process(line)f.close()

11.3.3    读取所有内容

如果文件不大,可以使用  read (把文件当作一个字符串)或者  readlines  (把文件读入一个字符串列表)

11.3.4  使用  fileinput     实现懒惰行迭代(因为它只读取实际需要的部分,所以不会占大量内存
当文件非常大的时候,前两个会占太多内存,可以使用 while循环遍历 行  或者 

使用fileinput
input ([files[,inplace[,backup]]) :遍历多个输入流中的行,返回能够用于for循环遍历的对象,可以以列表形式给出多个文件名
inplace(原地处理) 默认为False ,可以(inplace=True)对于要访问的每一行,需要打印处替代的内容,以返回到当前的输入文件
backup 把文件名扩展备份。
还有一些其他的方法,见p179


在旧式代码中还会使用xreadlines   实现懒惰行迭代,但是因为是旧式的,自己的代码中还是最好使用   fileinput        或文件迭代器


11.3.5        文件迭代器

文件对象其实是可迭代的      (所以之前那些方法干嘛???)    直接在for 循环中使用
f=open(filename)for line in f:    process(line)f.close()

同样,sys.stdin也是可迭代的


原创粉丝点击