从本篇开始准备对python文件的操作做一个系统总结。基础文件操作包括文件的文件的读取、创建、追加、删除、清空;按行进行或字节读写文件等内容。

一、python file open方法

Python 打开文件语法为: f = open(name[, mode[, buffering]])

各字段含义:

name: 所要打开的文件的名称,
mode:打开文件的方式:

1‘r’   :  读模式
2'w'  :   写模式
3'a'  :   追加模式
4'b'  :   二进制模式(可添加到其他模式中使用)
5'+'  :   读写模式(可添加到其他模式中使用)
6'U'  :   就是支持所有的换行模式,也就说‘\r'\n' '\r\n'都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。

buffering : 是否要缓冲

10 / False :    代表无缓冲
21 / True   :    代表有缓冲
3大于一的数字:   代表缓冲区大小(单位是字节)
4-1   :       默认缓冲区大小

上面mode列出的是基本模式,实际应用中的扩展模式有:

1"r"   以读方式打开,只能读文件,如果文件不存在,会发生异常。
2"w"   以写方式打开,只能写文件, 如果文件不存在,创建该文件。如果文件已存在,先清空,再打开文件。
3"rb"  以二进制读方式打开,只能读文件 , 如果文件不存在,会发生异常
4"wb"  以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件
5"rt"  以文本读方式打开,只能读文件 , 如果文件不存在,会发生异常
6"wt"  以文本写方式打开,只能写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件 。
7"rb+" 以二进制读方式打开,可以读、写文件 , 如果文件不存在,会发生异常
8"wb+" 以二进制写方式打开,可以读、写文件, 如果文件不存在,创建该文件。如果文件已存在,先清空,再打开文件。

由于默认为 r 模式,如果文件不存在,则会发生异常提示。

二、字节读取

1、read

1f.read(num)           //读出num个字节
2f.read()              //读出全部字节

2、write

1f.write(string)         //将string写入文件

三、行读写

1F.readline([size])    #读一行,如果定义了size,size的单位是byte,有可能返回的只是一行的一部分
2F.readlines([size])   #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
3F.write(str)          #把str写到文件中,write()并不会在str后加上一个换行符
4F.writelines(seq)     #把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。

四、其他方法

  • F.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError
  • F.flush() #把缓冲区的内容写入硬盘
  • F.fileno() #返回一个长整型的”文件标签“
  • F.isatty() #文件是否是一个终端设备文件(unix系统中的)
  • F.tell() #返回文件操作标记的当前位置,以文件的开头为原点
  • F.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
  • F.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
  • F.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。

五、示例

1、读取所有内容

1file_object = open('png.sh')
2try:
3     all_the_text = file_object.read()
4     print all_the_text,type(all_the_text)
5finally:
6     file_object.close( )

2、读固定字节

1file_object = open('abinfile', 'rb')
2try:
3    while True:
4         chunk = file_object.read(100)
5        if not chunk:
6            break
7         do_something_with(chunk)
8finally:
9     file_object.close( )

3、行读取

1with open('foo.txt', 'r') as f:
2    for line in f.readlines():
3        # do_something(line)
45with open('foo.txt', 'r') as f:
6    for line in f:
7        # do_something(line)

从Python 2.3开始,Python中的文件类型开始支持迭代功能,比如下面两段代码做的其实差不多:

但是,后面一种迭代占用更小的内存,而且更加智能(依赖于Python文件对象的实现),所需文件内容是自动从buffer中按照需要读取的,是值得鼓励的做法。

file.readlines()是把文件的全部内容读到内存,并解析成一个list,当文件的体积很大的时候,需要占用很多内存,使用该方法是一种不明智的做法。

还有一个file.xreadlines()方法,则直接返回一个iter(file)迭代器,在Python 2.3之后已经不推荐这种表示方法了。

4、写文件

 1#写文本文件
 2output = open('data', 'w')
 3#写二进制文件
 4output = open('data', 'wb')
 5#追加写文件
 6output = open('data', 'w+')
 7#写数据
 8file_object = open('thefile.txt', 'w')
 9file_object.write(all_the_text)
10file_object.close( )
11#写入多行
12file_object.writelines(list_of_text_strings)

注意,调用writelines写入多行在性能上会比使用write一次性写入要高

写入文件时换行符的处理:

1sample_list = [line+'\n' for line in sample_list]
2outfile.wirtelines(sample_list)

5、综合示例

 1#! /usr/bin/python
 2import os,sys
 3try:
 4    fsock = open("D:/pytest/test.py", "r")
 5except IOError:
 6    print "The file don't exist, Please double check!"
 7    exit()
 8print 'The file mode is ',fsock.mode
 9print 'The file name is ',fsock.name
10P = fsock.tell()
11print 'the postion is %d' %(P)
12fsock.close()
13#Read file
14fsock = open("D:/pytest/test.py", "r")
15AllLines = fsock.readlines()
16#Method 1
17for EachLine in fsock:
18    print EachLine
19#Method 2
20print 'Star'+'='*30
21for EachLine in AllLines:
22    print EachLine
23print 'End'+'='*30
24fsock.close()
25#write this file
26fsock = open("D:/pytest/test.py", "a")
27fsock.write("""
28#Line 1 Just for test purpose
29#Line 2 Just for test purpose
30#Line 3 Just for test purpose""")
31fsock.close()
32#check the file status
33S1 = fsock.closed
34if True == S1:
35    print 'the file is closed'
36else:
37    print 'The file donot close'

六、python读写大文件

实际应用中经常会遇到这样的情况,一台主机的物理内存只有2G,而文件大小有10G 。一次读取文件时,肯能会报memoryError错误。遇到这种问题时解决方法有两种:

文件块切割

将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。具体如下:

 1def readInChunks(fileObj, chunkSize=1024*1024*200):
 2    """
 3    Lazy function to read a file piece by piece.
 4    Default chunk size: 200MB.
 5    """
 6    while True:
 7        data = fileObj.read(chunkSize)
 8        if not data:
 9            break
10        yield data
11f = open('bigFile')
12for chuck in readInChunks(f):
13    do_something(chunk)

比如上面的方法中就将文件切割成200M大小的块。再进行读取操作。

提到读,还有写大文件的问题,网上看到通过使用模块mmap 来实现

参考页面:
stackoverflow
知乎
python中的readlines和xreadlines函数

想要了解更多,可以pydoc file 查看python file操作帮助文档。