经过CDays –5 的学习,我们知道了Python一部分基础的特性,现在我们继续回归主线。
这一次,我们第一次实现某个实用的功能,文件遍历。
根据书上写的需求 :
1.将光盘内容索引存储为硬盘上的文本文件。
2.可以根据硬盘上光盘信息进行检索
为了模拟光盘的内容,我们在D盘建了一个名为CDROM的文件夹,里面放进去了一些文件来模拟文档。
附录中我们给出了目录结构及批处理代码.附录1,2
我们遇到了第一个问题,怎么读取文件目录?
根据书上的指示,我们知道了os模块,其中有一个模块
os.listdir( )
他的功能是返回目录中中所有的文件和文件夹,括号中是 目录地址
让我们针对看开头设置的文件试一下。
import osprint os.listdir("D:\\CDROM")
可以看出,listdir只能给出确定的目录中的一层结构,不能对文件夹进行深度的遍历。所以我们还需要找到别的函数。
根据原书,我们又有了函数
os.walk( )
不知道这是啥玩意吧,其实我也不知道,让我们help一下。在命令行键入
help( os.walk )
我们得到了一大串输出。乱七八糟看不懂啊。后面有个例子,让我们看一下。。
import osfrom os.path import join, getsizefor root, dirs, files in os.walk('python/Lib/email'): print root, "consumes", print sum([getsize(join(root, name)) for name in files]), print "bytes in", len(files), "non-directory files" if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories
我们试着分析一下这个例程,先载入模块,然后一个循环,后面是地址,前面是我们刚刚提到的walk,复制一下,把目录改成光盘的。试试第一个print:
import osfor root, dirs, files in os.walk('D:\\CDROM'): print root
有了完整的目录输出。让我们重新读一下walk( )的help输出吧。
walk ( top, topdown=True, οnerrοr=None, followlinks=False )
函数声明有这么长,我们却只是用了一个参数。
总结一下里面说的。
1)参数top表示需要遍历的目录树的路径
2)参数topdown的默认值是"True",表示首先返回目录树下的文件,然后在遍历目录树的子目录.Topdown的值为"False"时,则表示先遍历目录树的子目录,返回子目录下的文件,最后返回根目录下的文件 3)参数onerror的默认值是"None",表示忽略文件遍历时产生的错误.如果不为空,则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历 4)该函数返回一个元组,该元组有3个元素,这3个元素分别表示每次遍历的路径名 root,目录列表 dirs 和文件列表 files让我们重新输出一下全部的信息。
import osfor root, dirs, files in os.walk('D:\\CDROM'): print root print dirs,files
输出就给一部分吧。
我们大概知道这是在输出什么,先不管是什么了,先把输出的东西保存一下。 数据库什么对我们来说太高端了,sql语句还不知道一丝一毫呢,文本文件是最简单的格式,我们用txt格式吧。
怎么保存文件呢,这是个新的问题,我们查一下《dive in python》
打开文件,读取文件都不看,我们先看怎么保存。具体查看:
写入文本文件。
根据C语言的经验,我们写入一个文件首先应该打开文件,如果没有文件首先应该新建文件。
在Python中我们有类似的方法。
我们直接打开文件,如果没有该文件就会自动新建。
打开一个文件我们可以用
open ( )
并且需要指定打开模式,
- “写”模式会重写文件。传递
mode='w'
参数给open()
函数。- “追加”模式会在文件末尾添加数据。传递
mode='a'
参数给open()
函数。
如果文件不存在,这两种模式都会新建一个文件。所以在Python中,不存在需要判断文件是否存在的啰嗦步骤。
让我们先打开文件。为了确保数据的完整,我们应该使用追加模式。
a_file = open ( 'D:\\CD.txt' , 'a')
当我们在命令行中执行这句话后。
现在,我们解决如何写入的问题。
对于操作文件的方法,Python中定义:
a_file = open ( 'D:\\CD.txt' , 'a')a_file.write( ' There is Kaysin !' ) # 写 入
好像还没有关闭文件。
我们现在调用 close 关闭它。
a_file = open ( 'D:\\CD.txt' , 'a')a_file.write( ' There is Kaysin !' )a_file.close()
让我们先完成上面的任务,把文件目录输入进文件夹。
import osa_file = open ( 'D:\\CD.txt' , 'a')for root,dirs,files in os.walk('D:\\CDROM'): a_file.write(root+dirs+files)a_file.close()
出错了,不过不要担心,只是数据类型不对。
我们学过print的格式化输出。write 也是输出函数,也可以用这样的函数。
import osa_file = open ( 'D:\\CD.txt' , 'a')for root,dirs,files in os.walk('D:\\CDROM'): a_file.write('%s %s %s' % (root,dirs,files)) # 格式化输出a_file.close()
不管格式如何,我们已经得到了所需的文件。
在这里,我们介绍一种DIP-----dive in python 中介绍的不需要手动关闭文件的方法。它并不适合重复文件读取。
with open('d:\\test.txt','w') as a_file: a_file.write('Hi .. There is Kaysin .!')
附录1.这里用批处理给出CDROM的目录结构:
D:.│ File.bat│ 目录.txt│ └─CAMERA │ data1.cab │ data1.hdr │ data2.cab │ IS.exe │ ISSetup.dll │ layout.bin │ setup.exe │ setup.ini │ setup.inx │ setup.iss │ SilentSetup.bat │ unsetup.iss │ _Setup.dll │ ├─X64 │ ├─Vista │ │ │ 370prop.ax │ │ │ dpinst.xml │ │ │ DPInst64.exe │ │ │ RemoveSM37X.exe │ │ │ Sensor.set │ │ │ SM37XCoInst.dll │ │ │ SMIexp.sys │ │ │ smiksdrv.cat │ │ │ SMIKsdrv.inf │ │ │ SMIksdrv.sys │ │ │ │ │ ├─smFile │ │ │ Privacy1024x600.bmp │ │ │ Privacy1024x768.bmp │ │ │ Privacy1280x1024.bmp │ │ │ Privacy1280x720.bmp │ │ │ Privacy1280x800.bmp │ │ │ Privacy1280x960.bmp │ │ │ Privacy1600x1200.bmp │ │ │ Privacy160x120.bmp │ │ │ Privacy176x144.bmp │ │ │ Privacy320x240.bmp │ │ │ Privacy352x288.bmp │ │ │ Privacy640x360.bmp │ │ │ Privacy640x400.bmp │ │ │ Privacy640x480.bmp │ │ │ Privacy800x600.bmp │ │ │ │ │ ├─SmiTwain │ │ │ SmiTwain.ds │ │ │ SmiTwain.ini │ │ │ SmiUI.dll │ │ │ │ │ └─x64 │ │ 370Prop64.ax │ │ SM37XCoInst.dll │ │ SMIexp.sys │ │ SMIksdrv.sys │ │ │ └─Xp │ │ 370prop.ax │ │ dpinst.xml │ │ DPInst64.exe │ │ RemoveSM37X.exe │ │ Sensor.set │ │ SM37XCoInst.dll │ │ SMIexp.sys │ │ smiksdrv.cat │ │ SMIKsdrv.inf │ │ SMIksdrv.sys │ │ │ ├─smFile │ │ Privacy1024x600.bmp │ │ Privacy1024x768.bmp │ │ Privacy1280x1024.bmp │ │ Privacy1280x720.bmp │ │ Privacy1280x800.bmp │ │ Privacy1280x960.bmp │ │ Privacy1600x1200.bmp │ │ Privacy160x120.bmp │ │ Privacy176x144.bmp │ │ Privacy320x240.bmp │ │ Privacy352x288.bmp │ │ Privacy640x360.bmp │ │ Privacy640x400.bmp │ │ Privacy640x480.bmp │ │ Privacy800x600.bmp │ │ │ ├─SmiTwain │ │ SmiTwain.ds │ │ SmiTwain.ini │ │ SmiUI.dll │ │ │ └─x64 │ 370Prop64.ax │ SM37XCoInst.dll │ SMIexp.sys │ SMIksdrv.sys │ └─X86 ├─Vista │ │ 370prop.ax │ │ dpinst.xml │ │ DPInst32.exe │ │ RemoveSM37X.exe │ │ Sensor.set │ │ SM37XCoInst.dll │ │ SMIexp.sys │ │ smiksdrv.cat │ │ SMIKsdrv.inf │ │ SMIksdrv.sys │ │ │ ├─smFile │ │ Privacy1024x600.bmp │ │ Privacy1024x768.bmp │ │ Privacy1280x1024.bmp │ │ Privacy1280x720.bmp │ │ Privacy1280x800.bmp │ │ Privacy1280x960.bmp │ │ Privacy1600x1200.bmp │ │ Privacy160x120.bmp │ │ Privacy176x144.bmp │ │ Privacy320x240.bmp │ │ Privacy352x288.bmp │ │ Privacy640x360.bmp │ │ Privacy640x400.bmp │ │ Privacy640x480.bmp │ │ Privacy800x600.bmp │ │ │ └─SmiTwain │ SmiTwain.ds │ SmiTwain.ini │ SmiUI.dll │ └─Xp │ 370prop.ax │ dpinst.xml │ DPInst32.exe │ RemoveSM37X.exe │ Sensor.set │ SM37XCoInst.dll │ SMIexp.sys │ smiksdrv.cat │ SMIKsdrv.inf │ SMIksdrv.sys │ ├─smFile │ Privacy1024x600.bmp │ Privacy1024x768.bmp │ Privacy1280x1024.bmp │ Privacy1280x720.bmp │ Privacy1280x800.bmp │ Privacy1280x960.bmp │ Privacy1600x1200.bmp │ Privacy160x120.bmp │ Privacy176x144.bmp │ Privacy320x240.bmp │ Privacy352x288.bmp │ Privacy640x360.bmp │ Privacy640x400.bmp │ Privacy640x480.bmp │ Privacy800x600.bmp │ └─SmiTwain SmiTwain.ds SmiTwain.ini SmiUI.dll
附录2.批处理遍历文件夹代码
tree /F >目录.txt