-- ZoomQuiet [2005-02-04 03:06:47]
可敬的 潘俊勇 居士百忙中发现的,在下也刚好在频率操作文件,所以翻译之!贡献之!
File Management in Python
介绍
Contents
文件处理是很多应用的基础功能, 相比其它语言 Python 对于文件处理更加容易; 下面由 Peyton McCullough 来解释其基础
- 文件处理是很多应用的重要功能,不许是用什么语言开发的.
- 这里我们要尝试各种使用对文件的操作:
- 读
- 写
- 补
- 或是其它古怪的事儿
- Let's get started.
读和写 Reading and Writing
- 读/写 是对文件操作基础的基础了!
我们打开文件准备写:
Toggle line numbers1 fileHandle = open ( 'test.txt', 'w' )
这里的’w‘,指示我们将进行写
然后写入一些内容:
Toggle line numbers1 fileHandle.write ( 'This is a test.\nReally, it is.' )
这里写入文件的第一行是字串"This is a test.",第二行就是'“Really, it is.”'
这是使用 \n 换行符来实现的
最后我们要关闭文件句柄:
Toggle line numbers1 fileHandle.close()
- 正如所见,在Python 的对象世界中文件操作非常的方便
注意;“w”声明下的写入,将清除即有内容,如果你想追加内容 使用“a”模式
比如说:
那么从外部文件读入内容:
- 这里打印出所有文件内容
也可以仅仅读一行:
也可以将所有行读取为一个列表:
读取文件时,Python 的读取位置会记录下来,例如:
- 只有第二行会打印出来
当然!我们可以告诉Python 从指定位置开始读取:
- 以上示例就是令Python 从文件的第一个字节开始读取
同样我们也可以获知识当前的读取位置信息:
也可以仅仅一次读取文件的几个字节:
在Windows 和 Macintosh中, 有时需要读写二进制文件,比如说;图片,可执行文件;那未使用“b”模式就好:
-- ZoomQuiet [2005-02-04 06:36:51]
获得外部文件信息
ZoomQuiet [2005-02-04 06:51:15] 获得外部文件信息
- 通过一些Python 模块,可以方便的获得即有文件的信息;
获得基础信息使用 "os" 模块中的 "stat" 模块:
Toggle line numbers1 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.'
- 以上示例,创建了一个字典来记录文件的各种信息,也同时汇报是否为目录
我们也可进一步获取文件其它信息:
Toggle line numbers1 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" 模块收集其它信息:
目录处理
目录处理
目录,就象 规则文件,也非常容易处理,我们先来侦听目录:
Toggle line numbers1 import os 2 for fileName in os.listdir ( '/' ): 3 print fileName
- 正如所见,非常的简单 仅仅三行内就解决问题
创建目录也一样简单:
Toggle line numbers1 import os 2 os.mkdir ( 'testDirectory' )
删除和建立目录一样简单:
Toggle line numbers1 import os 2 os.rmdir ( 'testDirectory' )
可以一次性创建很多目录:
Toggle line numbers1 import os 2 os.makedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' )
不用任何多余操作,一次性清除很多目录也一样方便:
Toggle line numbers1 import os 2 os.removedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' )
- 如果我们霰针对不同类型的文件进行操作,那未有"fnmatch"模块可以轻易的进行处理.
这里,我们将所有遇到的 ".txt" 文件内容打印出来,所有 ".exe" 文件的名称打印出来:
其中 *,星号代表可以匹配所有字符(当然是正则表达式中意义)
自然的,我们想仅仅匹配一个字符就 ? -- 问号:
- 在"fnmatch"模块,我们可以创建正则表达式来应用,只要通过 "re" 模块:
- 如果想搜索一种类型的所有文件,有"glob"模块轻易的作到,使用模式与 "fnmatch" 模块一样:
- 也可以在正则表达式的模式中指定一定范围内的特性, 比如说这样我们可以搜索出所有文件名是一个数字的 文本文件:
-- ZoomQuiet [2005-02-06 14:59:24]
序列化数据
序列化数据 Pickling Data
- 前几节的文件处理,都是读写字串信息;
- 但是在一些情况中,你需要操作其它的数据类型,比如说: 列表,元组,字典或是其它对象.
- 在Python 通过序列化方法来处理,标准化库中已经包含了这个 "pickle" 模块.
让我们先序列化一个混合了字串和数字的列表:
解序列,也非常容易:
当然可以存储复杂的数据:
Toggle line numbers1 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 实现的相同功能的模块, 因为它要更快:
-- ZoomQuiet [2005-02-06 15:27:27]
创立内存文件
创建内存文件
- 你遇到的很多模块中的函式都需要一个文件对象作参数,有时候创建一个真的文件很麻烦,那未,感谢 Python吧,你可以通过"StringIO"模块来创建一个保存在内存中的文件来使用:
还有 "cStringIO" 模块.与"StringIO" 一样的使用,如同"cPickle" 对"Pickle",这是更快的 C 语言现实:
总结 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