http://ads.developershed.com/articleboxes/devshedtitle.gif

-- ZoomQuiet [2005-02-04 03:06:47]

可敬的 潘俊勇 居士百忙中发现的,在下也刚好在频率操作文件,所以翻译之!贡献之!

File Management in Python

介绍

文件处理是很多应用的基础功能, 相比其它语言 Python 对于文件处理更加容易; 下面由 Peyton McCullough 来解释其基础


  • 文件处理是很多应用的重要功能,不许是用什么语言开发的.
  • 这里我们要尝试各种使用对文件的操作:
    • 或是其它古怪的事儿
  • Let's get started.

读和写 Reading and Writing

  • 读/写 是对文件操作基础的基础了!
    • 我们打开文件准备写:

         1     fileHandle = open ( 'test.txt', 'w' ) 
      
    • 这里的’w‘,指示我们将进行写

    • 然后写入一些内容:

         1     fileHandle.write ( 'This is a test.\nReally, it is.' ) 
      
    • 这里写入文件的第一行是字串"This is a test.",第二行就是'“Really, it is.”'

      • 这是使用 \n 换行符来实现的

    • 最后我们要关闭文件句柄:

         1     fileHandle.close() 
      
  • 正如所见,在Python 的对象世界中文件操作非常的方便
    • 注意;“w”声明下的写入,将清除即有内容,如果你想追加内容 使用“a”模式

    • 比如说:

         1     fileHandle = open ( 'test.txt', 'a' )
         2 
         3     fileHandle.write ( '\n\n\nBottom line.' )
         4 
         5     fileHandle.close() 
      
  • 那么从外部文件读入内容:

       1  
       2     fileHandle = open ( 'test.txt' )
       3 
       4     print fileHandle.read()
       5 
       6     fileHandle.close() 
    
    • 这里打印出所有文件内容
    • 也可以仅仅读一行:

         1     
         2     fileHandle = open ( 'test.txt' )
         3 
         4     print fileHandle.readline() # "This is a test."
         5 
         6     fileHandle.close() 
      
    • 也可以将所有行读取为一个列表:

         1     fileHandle = open ( 'test.txt' )
         2 
         3     fileList = fileHandle.readlines()
         4 
         5     for fileLine in fileList:
         6 
         7        print '>>', fileLine
         8 
         9     fileHandle.close() 
      
  • 读取文件时,Python 的读取位置会记录下来,例如:

       1     fileHandle = open ( 'test.txt' )
       2 
       3     garbage = fileHandle.readline()
       4 
       5     fileHandle.readline() # "Really, it is."
       6 
       7     fileHandle.close() 
    
    • 只有第二行会打印出来
    • 当然!我们可以告诉Python 从指定位置开始读取:

         1     fileHandle = open ( 'test.txt' )
         2 
         3     garbage = fileHandle.readline()
         4 
         5     fileHandle.seek ( 0 )
         6 
         7     print fileHandle.readline() # "This is a test."
         8 
         9     fileHandle.close() 
      
    • 以上示例就是令Python 从文件的第一个字节开始读取
    • 同样我们也可以获知识当前的读取位置信息:

         1     fileHandle = open ( 'test.txt' )
         2 
         3     print fileHandle.readline() # "This is a test."
         4 
         5     print fileHandle.tell() # "17"
         6 
         7     print fileHandle.readline() # "Really, it is." 
      
    • 也可以仅仅一次读取文件的几个字节:

         1     fileHandle = open ( 'test.txt' )
         2 
         3     print fileHandle.read ( 1 ) # "T"
         4 
         5     fileHandle.seek ( 4 )
         6 
         7     print FileHandle.read ( 1 ) # "T" 
      
  • 在Windows 和 Macintosh中, 有时需要读写二进制文件,比如说;图片,可执行文件;那未使用“b”模式就好:

       1     fileHandle = open ( 'testBinary.txt', 'wb' )
       2 
       3     fileHandle.write ( 'There is no spoon.' )
       4 
       5     fileHandle.close()
       6 
       7     fileHandle = open ( 'testBinary.txt', 'rb' )
       8 
       9     print fileHandle.read()
      10 
      11     fileHandle.close() 
    


-- ZoomQuiet [2005-02-04 06:36:51]

获得外部文件信息


ZoomQuiet [2005-02-04 06:51:15] 获得外部文件信息

  • 通过一些Python 模块,可以方便的获得即有文件的信息;
  • 获得基础信息使用 "os" 模块中的 "stat" 模块:

       1     import os
       2     import stat
       3     import time
       4 
       5     fileStats = os.stat ( 'test.txt' )
       6     fileInfo = {
       7        'Size' : fileStats [ stat.ST_SIZE ],
       8        'LastModified' : time.ctime ( fileStats [ stat.ST_MTIME ] ),
       9        'LastAccessed' : time.ctime ( fileStats [ stat.ST_ATIME ] ),
      10        'CreationTime' : time.ctime ( fileStats [ stat.ST_CTIME ] ),
      11        'Mode' : fileStats [ stat.ST_MODE ]
      12     }
      13     for infoField, infoValue in fileInfo.items():
      14        print infoField, ':' + infoValue
      15     if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ):
      16        print '是目录 Directory. '
      17     else:
      18        print '非目录 Non-directory.' 
    
    • 以上示例,创建了一个字典来记录文件的各种信息,也同时汇报是否为目录
    • 我们也可进一步获取文件其它信息:

         1     import os
         2     import stat
         3     fileStats = os.stat ( 'test.txt' )
         4     fileMode = fileStats [ stat.ST_MODE ]
         5     if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ):
         6        print '乃规则的数据文件 Regular file.'
         7     elif stat.S_ISDIR ( fileSTats [ stat.ST_MODe ] ):
         8        print '乃目录 Directory.'
         9     elif stat.S_ISLNK ( fileSTats [ stat.ST_MODe ] ):
        10        print '乃文件链接 Shortcut.'
        11     elif stat.S_ISSOCK ( fileSTats [ stat.ST_MODe ] ):
        12        print '乃 Socket.'
        13     elif stat.S_ISFIFO ( fileSTats [ stat.ST_MODe ] ):
        14        print '乃通道 Named pipe.'
        15     elif stat.S_ISBLK ( fileSTats [ stat.ST_MODe ] ):
        16        print '乃块设备 Block special device.'
        17     elif stat.S_ISCHR ( fileSTats [ stat.ST_MODe ] ):
        18        print '乃字符设备 Character special device.' 
      
  • 另外我们可以使用 "os.path" 模块收集其它信息:

       1     import os.path
       2     fileStats = 'test.txt'
       3     if os.path.isdir ( fileStats ):
       4        print 'Directory.'
       5     elif os.path.isfile ( fileStats ):
       6        print 'File.'
       7     elif os.path.islink ( fileStats ):
       8        print 'Shortcut.'
       9     elif os.path.ismount ( fileStats ):
      10        print 'Mount point.' 
    

目录处理

目录处理

  • 目录,就象 规则文件,也非常容易处理,我们先来侦听目录:

       1     import os
       2     for fileName in os.listdir ( '/' ):
       3        print fileName 
    
    • 正如所见,非常的简单 仅仅三行内就解决问题
  • 创建目录也一样简单:

       1     import os
       2     os.mkdir ( 'testDirectory' ) 
    
  • 删除和建立目录一样简单:

       1     import os
       2     os.rmdir ( 'testDirectory' ) 
    
  • 可以一次性创建很多目录:

       1     import os
       2     os.makedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' ) 
    
  • 不用任何多余操作,一次性清除很多目录也一样方便:

       1     import os
       2     os.removedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' ) 
    
  • 如果我们霰针对不同类型的文件进行操作,那未有"fnmatch"模块可以轻易的进行处理.
    • 这里,我们将所有遇到的 ".txt" 文件内容打印出来,所有 ".exe" 文件的名称打印出来:

         1     import fnmatch
         2     import os
         3 
         4     for fileName in os.listdir ( '/' ):
         5 
         6        if fnmatch.fnmath ( fileName, '*.txt' ):
         7 
         8           print open ( fileName ).read()
         9 
        10        elif fnmatch.fnmatch ( fileName, '*.exe' ):
        11 
        12           print fileName 
      
    • 其中 *,星号代表可以匹配所有字符(当然是正则表达式中意义)

    • 自然的,我们想仅仅匹配一个字符就 ? -- 问号:

         1     import fnmatch
         2 
         3     import os
         4 
         5     for fileName in os.listdir ( '/' ):
         6 
         7        if fnmatch.fnmatch ( fileName, '?.txt' ):
         8 
         9           print 'Text file.' 
      
    • 在"fnmatch"模块,我们可以创建正则表达式来应用,只要通过 "re" 模块:
         1     import fnmatch
         2 
         3     import os
         4 
         5     import re
         6 
         7     filePattern = fnmatch.translate ( '*.txt' )
         8 
         9     for fileName in os.listdir ( '/' ):
        10 
        11        if re.match ( filePattern, fileName ):
        12 
        13           print 'Text file.'
      
    • 如果想搜索一种类型的所有文件,有"glob"模块轻易的作到,使用模式与 "fnmatch" 模块一样:
      •    1     import glob
           2 
           3     for fileName in glob.glob ( '*.txt' ):
           4 
           5        print 'Text file.' 
        
    • 也可以在正则表达式的模式中指定一定范围内的特性, 比如说这样我们可以搜索出所有文件名是一个数字的 文本文件:
         1     import glob
         2 
         3     for fileName in glob.glob ( '[0-9].txt' ):
         4 
         5        print fileName 
      


-- ZoomQuiet [2005-02-06 14:59:24]

序列化数据

序列化数据 Pickling Data

  • 前几节的文件处理,都是读写字串信息;
  • 但是在一些情况中,你需要操作其它的数据类型,比如说: 列表,元组,字典或是其它对象.
  • 在Python 通过序列化方法来处理,标准化库中已经包含了这个 "pickle" 模块.
    • 让我们先序列化一个混合了字串和数字的列表:

         1     import pickle
         2 
         3     fileHandle = open ( 'pickleFile.txt', 'w' )
         4 
         5     testList = [ 'This', 2, 'is', 1, 'a', 0, 'test.' ]
         6 
         7     pickle.dump ( testList, fileHandle )
         8 
         9     fileHandle.close() 
      
    • 解序列,也非常容易:

         1     import pickle
         2 
         3     fileHandle = open ( 'pickleFile.txt' )
         4 
         5     testList = pickle.load ( fileHandle )
         6 
         7     fileHandle.close() 
      
    • 当然可以存储复杂的数据:

         1     import pickle
         2 
         3     fileHandle = open ( 'pickleFile.txt', 'w' )
         4 
         5     testList = [ 123
         6                 , { 'Calories' : 190 }
         7                 , 'Mr. Anderson'
         8                 , [ 1, 2, 7 ] 
         9                 ]
        10 
        11     pickle.dump ( testList, fileHandle )
        12 
        13     fileHandle.close()
        14 
        15     import pickle
        16 
        17     fileHandle = open ( 'pickleFile.txt' )
        18 
        19     testList = pickle.load ( fileHandle )
        20 
        21     fileHandle.close() 
      
    • 如你所见,通过"pickle"模块可以非常简单序列化对象为文件存储,你也可以使用 "cPickle" 模块(如果你安装的话),一看名字就知道这是使用 C 实现的相同功能的模块, 因为它要更快:

         1     import cPickle
         2 
         3     fileHandle = open ( 'pickleFile.txt', 'w' )
         4 
         5     cPickle.dump ( 1776, fileHandle )
         6 
         7     fileHandle.close() 
      


-- ZoomQuiet [2005-02-06 15:27:27]

创立内存文件

创建内存文件

  • 你遇到的很多模块中的函式都需要一个文件对象作参数,有时候创建一个真的文件很麻烦,那未,感谢 Python吧,你可以通过"StringIO"模块来创建一个保存在内存中的文件来使用:
       1     import StringIO
       2 
       3     fileHandle = StringIO.StringIO ( "Let freedom ring." )
       4 
       5     print fileHandle.read() # "Let freedom ring."
       6 
       7     fileHandle.close() 
    
    • 还有 "cStringIO" 模块.与"StringIO" 一样的使用,如同"cPickle" 对"Pickle",这是更快的 C 语言现实:

         1     import cStringIO
         2 
         3     fileHandle = cStringIO.cStringIO ( "To Kill a Mockingbird" )
         4 
         5     print fileHandle.read() # "To Kill a Mockingbid"
         6 
         7     fileHandle.close() 
      


总结 Conclusion

  • 文件处理是很多语言应用时要经常面对的事务
  • 谢天谢地,Python 让这项任务变得的比其它语言要轻松的多
    • 提供了很多标准模块来帮助程序员
    • 而且面向对象的处置方式也令事情更加简单
  • 现在我们理解了Python 中基本的文件处理,那未轻松在你的应用中吧.


-- ZoomQuiet [2005-02-06 15:50:41]

撰写团队

反馈

a small tip: 用print >>f, a_string可以替代f.write(a_string + '\n')。更直观些。 -- QiangningHong 2005/03/11

error: cStringIO module里没有cStringIO方法,应该和StringIO module里的一样,是StringIO().代码:fileHandle = cStringIO.StringIO("to kill a mockingbird") -- DFar 2005/03/11

FileManagementInPython (last edited 2009-12-25 07:16:25 by localhost)