-- ZoomQuiet [2005-02-04 03:06:47]
可敬的 潘俊勇 居士百忙中发现的,在下也刚好在频率操作文件,所以翻译之!贡献之!
1. File Management in Python
1.1. 介绍
Contents
文件处理是很多应用的基础功能, 相比其它语言 Python 对于文件处理更加容易; 下面由 Peyton McCullough 来解释其基础
- 文件处理是很多应用的重要功能,不许是用什么语言开发的.
- 这里我们要尝试各种使用对文件的操作:
- 读
- 写
- 补
- 或是其它古怪的事儿
- Let's get started.
1.1.1. 读和写 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]
1.2. 获得外部文件信息
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.3. 目录处理
目录处理
目录,就象 规则文件,也非常容易处理,我们先来侦听目录:
1 2 import os 3 for fileName in os.listdir ( '/' ): 4 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 2 import fnmatch 3 4 import os 5 6 import re 7 8 filePattern = fnmatch.translate ( '*.txt' ) 9 10 for fileName in os.listdir ( '/' ): 11 12 if re.match ( filePattern, fileName ): 13 14 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]
1.4. 序列化数据
序列化数据 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 2 import pickle 3 4 fileHandle = open ( 'pickleFile.txt' ) 5 6 testList = pickle.load ( fileHandle ) 7 8 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 2 import cPickle 3 4 fileHandle = open ( 'pickleFile.txt', 'w' ) 5 6 cPickle.dump ( 1776, fileHandle ) 7 8 fileHandle.close()
-- ZoomQuiet [2005-02-06 15:27:27]
1.5. 创立内存文件
创建内存文件
- 你遇到的很多模块中的函式都需要一个文件对象作参数,有时候创建一个真的文件很麻烦,那未,感谢 Python吧,你可以通过"StringIO"模块来创建一个保存在内存中的文件来使用:
1 2 import StringIO 3 4 fileHandle = StringIO.StringIO ( "Let freedom ring." ) 5 6 print fileHandle.read() # "Let freedom ring." 7 8 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]
1.6. 撰写团队
2. 反馈
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