首页 > 代码库 > python基础教程_学习笔记21:文件和素材

python基础教程_学习笔记21:文件和素材

文件和素材

打开文件

open函数用来打开文件,语法如下:

open([name[,mode[,buffering]])

 

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

>>> f=open(r‘D:\software(x86)\Python27\README.txt‘)

 

如果文件不存在,则出现错误:

>>> f=open(r‘D:\software(x86)\Python27\README_unknown.txt‘)

 

Traceback (most recent call last):

  File "<pyshell#5>", line 1, in <module>

    f=open(r‘D:\software(x86)\Python27\README_unknown.txt‘)

IOError: [Errno 2] 

No such file or directory: ‘D:\\software(x86)\\Python27\\README_unknown.txt‘

文件模式

如果open函数只带一个文件名参数,则可以获取能读取文件内容的文件对象。

如果要向文件内写入内容,则必须提供一个模式参数来显式声明。open函数中的模式参数只有几个值。

值 描述

‘r’ 读模式

‘w’ 写模式

‘a’ 追加模式

‘b’ 二进制模式(可添加到其他模式中使用)

‘+’ 读/写模式(可添加到其他模式中使用)

 

明确地指定读模式和什么模式参数都不用的效果是一样的。使用写模式可以向文件写入内容。

‘+’参数可以用到其他任何模式中,指明读和写都是允许的。比如’r+’能在打开一个文件文件用来读写时使用。

‘b’模式改变处理文件的方法。一般来说,python假定处理的是文本文件(包括字符)。通常这样做不会有什么问题,但如果处理的是一些其他类型的文件(二进制文件),比如声音剪辑或图像,那么应该在模式参数中增加’b’。参数’rb’可以用来读取一个二进制文件。

注意:通过在模式参数中使用U参数能够在打开文件时使用通用的换行符支持模式,在这种模式下,所有的换行符/字符串(\r\n\r\n)都被转换成\n,而不用考虑运行的平台。

缓冲

open函数的第3个参数控制着文件的缓冲。

如果参数是0FalseI/O就是无缓冲的(所有的读写操作直接针对硬盘)

如果参数是1TrueI/O就是有缓冲的(python使用内存代替硬盘,让程序更快,只有flushclose时才会更新硬盘上的数据);

大于1的数字代表缓冲区的大小(单位是字节),

-1(或其他负数)代表使用默认的缓冲区大小。

基本文件方法

类文件对象是支持一些文件的方法的对象,更重要的是支持read方法或者write方法,或两者兼有。

读和写

文件(或流)最重要的能力是提供或者接受数据。如果有一个名为f的类文件对象,就可以使用f.write方法和f.read方法(以字符串形式)写入和读取数据。

每次调用f.write(string)时,所提供的参数string会被追加到文件中已存在部分的后面。

>>> f=open(‘D:\\software(x86)\\Python27\\temp\\temp.txt‘,‘w‘)

>>> f.write(‘Hello, ‘)

>>> f.write(‘signjing!‘)

>>> f.close()

在完成了一个文件的操作时,调用close函数。

>>> f=open(‘D:\\software(x86)\\Python27\\temp\\temp.txt‘,‘r‘)

读取很简单,只要记得告诉要读取多少字符(字节)即可。

>>> f.read()

‘Hello, signjing!‘

当不提供要读取的字符数时,read函数读取剩下的文件。

>>> f.read()

‘‘

>>> f.close()

 

w模式打开文件时即便没有对文件进行写入,也会先清空文件,这一点请注意。

管式输出

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

GNU bashwindows下也有,详情请了解cygwin

Mac OS X上,通过终端,可以使用shell文件。

 

$ cat somescript.py

#File: some script.py

 

import sys

text=sys.stdin.read()

word=text.split()

wordcount=len(word)

print "Wordcount: ",wordcount

print [w for w in word]

 

$ cat somescript.py | python somescript.py

Wordcount:  17

[‘#File:‘, ‘some‘, ‘script.py‘, ‘import‘, ‘sys‘, ‘text=sys.stdin.read()‘, ‘word=text.split()‘, ‘wordcount=len(word)‘, ‘print‘, ‘"Wordcount:‘, ‘",wordcount‘, ‘print‘, ‘[w‘, ‘for‘, ‘w‘, ‘in‘, ‘word]‘]

读写行

通常来说,逐个字符读取文件是没有问题的,逐行读取也可以。

还可以使用file.readline读取单独的一行(从当前位置开始直到一个换行符出现,也读取这个换行符)。

不使用任何参数或者使用一个非负的整数作为readline可以读取的字符(或字节)的最大值。

readlines方法可以读取一个文件中的所有行并将其作为列表返回。

 

writelines方法和readlines相反:传给它一个字符串的列表(实际上任何序列或可迭代的对象都行),它会把所有的字符串写入文件(或流)。

注意:程序不会增加新行,需要自己添加。没有writeline方法,因为可以使用write替代。

关闭文件

应该牢记使用close方法关闭文件。

通常来说,一个文件对象在退出程序后(也可能退出前)自动关闭,尽管十分关闭文件不是很重要,但关闭文件是没有什么害处的,可以避免在某些操作系统或设置中进行无用的修改,这样做也会避免用完系统中所打开文件的配额。

 

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

 

如果想确保文件被关闭了,应该使用try/finally语句,并在finally子句中调用close方法。

 

事实上,有专门为这种情况设计的语句,即with语句:

with open(“somefile.txt”) as somefile:

do_something(somefile)

 

with语句可以打开文件并且将其赋值到变量上,之后可以将数据写入语句体中的文件或执行其他操作。文件在语句结束后会被自动关闭,即使是由于异常引起的结束也是如此。

使用基本文件方法

read(n)

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> f.read(7)

‘#File: ‘

>>> f.read(4)

‘some‘

>>> f.close()

 

read()

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> print f.read()

#File: some script.py

 

import sys

text=sys.stdin.read()

word=text.split()

wordcount=len(word)

print "Wordcount: ",wordcount

print [w for w in word]

 

>>> f.close()

 

readline()

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> for i in range(3):

...     print str(i) + ‘: ‘ + f.readline()

...

0: #File: some script.py

 

1:

 

2: import sys

 

readlines()

>>> import pprint

>>> pprint.pprint(open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘).readlines())

[‘#File: some script.py\n‘,

 ‘\n‘,

 ‘import sys\n‘,

 ‘text=sys.stdin.read()\n‘,

 ‘word=text.split()\n‘,

 ‘wordcount=len(word)\n‘,

 ‘print "Wordcount: ",wordcount\n‘,

 ‘print [w for w in word]\n‘]

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> f.readlines()

[‘#File: some script.py\n‘, ‘\n‘, ‘import sys\n‘, ‘text=sys.stdin.read()\n‘, ‘word=text.split()\n‘, ‘wordcount=len(word)\n‘, ‘print "Wordcount: ",wordcount\n‘, ‘print [w for w in word]\n‘]

write(string)

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘,‘w‘)

>>> f.write("print ‘hello, \nSignjing!‘")

>>> f.close()

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> f.readlines()

["print ‘hello, \n", "Signjing!‘"]

writelines(list)

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> lines=f.readlines()

>>> f.close()

>>> lines[1]=‘isn\‘t a\n‘

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘,‘w‘)

>>> f.writelines(lines)

>>> f.close()

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> f.readlines()

["print ‘hello, \n", "isn‘t a\n"]

>>> f.close()

对文件内容进行迭代

按字节处理

最常见的对文件内容进行迭代的方法是while循环中使用read方法:对每个字符进行循环;

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> while True:

...     char=f.read(1)

...     if not char:

...             break

...     print char

...

p

r

i

n

t

 

h

e

l

l

o

,

 

 

 

i

s

n

t

 

a

 

 

>>> f.close()

按行处理

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> while True:

...     line=f.readline()

...     if not line:

...             break

...     print line

...

print ‘hello,

 

isn‘t a

 

>>> f.close()

读取所有内容

如果文件不是很大,可以使用不带参数的read方法一次读取整个文件(把整个文件当作一个字符串来读取),或者使用readlines方法(把文件读入一个字符串列表,在列表中每个字符串就是一行)。

注意:将文件的内容读入一个字符串或者读入列表在其他时候也很有用。比如在读取后,可以对字符串使用正则表达式操作,也可以将行列表存入一些的数据结构中,以备将来使用。

 

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> print [char for char in f.read()]

[‘p‘, ‘r‘, ‘i‘, ‘n‘, ‘t‘, ‘ ‘, "‘", ‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘, ‘,‘, ‘ ‘, ‘\n‘, ‘i‘, ‘s‘, ‘n‘, "‘", ‘t‘, ‘ ‘, ‘a‘, ‘\n‘]

 

>>> f.close()

 

>>> f=open(r‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)

>>> print [line for line in f.readlines()]

["print ‘hello, \n", "isn‘t a\n"]

 

>>> f.close()

使用fileinput实现懒惰行迭代

在需要对一个非常大的文件进行迭代行的操作时,readlines会占用太多的内存。这时可以使用while+readline方法来替代。

 

>>> import fileinput

>>> print [line for line in fileinput.input(‘/home/ggz2/magiccube/mysh/pys/somescript.py‘)]

["print ‘hello, \n", "isn‘t a\n"]

文件迭代器

文件对象是可迭代的,这意味着可以直接在for循环中使用它们,从而对它们进行迭代。

 

只要没有向文件中写入内容,那么不关闭文件也是可以的。

 

>>> f=open(‘/home/ggz2/magiccube/mysh/pys/somescript.py‘,‘w‘)

>>> f.write("1st:1\n")

>>> f.write("2nd:2\n")

>>> f.write("3rd:3\n")

>>> f.close()

>>> lines=list(open(‘/home/ggz2/magiccube/mysh/pys/somescript.py‘))

>>> lines

[‘1st:1\n‘, ‘2nd:2\n‘, ‘3rd:3\n‘]

>>> lines[2]

‘3rd:3\n‘

>>> lines[1]

‘2nd:2\n‘

>>> lines[0]

‘1st:1\n‘

 

使用序列对一个打开的文件进行解包操作,把每行都放入一个单独的变量中,这样做是很有实用性的,因为一般不知道文件有多少行,但它演示了文件对象的“迭代性”。