用python脚本组织自己的代码
时间:2010-03-30 来源:ymll
我有很多电子书,幸运的是,所有这些电子书都按不同的分类组织的不错(至少我自认为如此^_^),比如其中有一个名为program_related的目录里面有各种各样与程序设计有关的电子书,然后在这个目录下面,我又将其分为ANCI_C,ANCI_CPP,脚本,面向对象,算法,多线程,linux_program等等,当然,这些目录下面都有自己的目录结构。
要学习这些书籍(其实大部分我都没看过),当然离不开动手练习,到这里的时候,我的做法就不那么科学了,甚至有点恶心,翻开我的home目录看看就知道了。在我的home目录下,有一个src/exec目录,里面有一堆自己的练习(不过这个里面倒是按照书本名字组织好的),另外有一个script /exec目录,里面也有一堆自己的练习,而在study目录(我的电子书们就放在study/e_book目录中)下,还有一个叫exec的目录,里面也有一堆练习……每当我打开一本看过一半的电子书,想动手试一试的时候,总觉得要面对异常噩梦,因为我不知道自己以前读这本书时将代码撂哪了,于是开始一顿乱找……
好了,罗嗦这么多,该进入正题了。现在我准备改变这种情况干这样一件事,建立一个总的src_exec目录,里面的子目录层次完全按照放置电子书的目录中的结构来组织,比如说假如我有如下的电子书目录:
e_book:
prog:
book1.pdf
book2.chm
bash:
book3.pdf
book4.chm
现在我要建立一个这样的练习目录(book1/book2/book3/book4均为目录名):
src_exer:
prog:
book1:
book2:
bash:
book3:
book4:
然后把e_book目录重新组织成以下形式:
e_book:
prog:
book1:
src
book1.pdf
book2:
src
book2.pdf
bash:
book3:
src
book3.pdf
book2:
src
book3.pdf
其中src为到src_exer中相应目录的软链接
上面就是我的需求
这个问题用递归解决是最自然不过了,我要首先将问题交付给main函数(此main不同于c中的main,只是我习惯了这么写而已),其接口如下:
main(bookDir, srcDir)
(1) 因为在bookDir中,有可能有文件,也可能有子目录。对于子目录来说,我们需要在srcDir中建立相应的子目录,以形成相同的结构,而对于文件,我需要以不含后缀的文件名在srcDir中建立子目录,来放置本电子书对应的练习代码。
根据上面的论述,对于bookDir中的任意项目(包括目录和文件),我们都需要在srcDir中建立相应的目录,唯一需要注意的是,对于建立与文件对应的目录时,我们需要去掉扩展名。
(2) 接下来我们需要改变bookDir中文件名的路径,对每一个bookDir/file.ext,我需要建立bookDir/file目录,然后将file.ext移至新建立的bookDir/file目录,再在bookDir/file目录中建立到srcDir/file/(该目录已经在第1步中建立)的链接,这里我用的是符号链接,至于为什么不建立硬链接,我也不知道,如果你有好的理由,欢迎探讨
(3) 到第(2)步结束时,bookDir/目录中的工作已经完成,该对bookDir/中的子目录调用main(bookDir/subDir, srcDir/subDir)了,这里有两个需要注意的地方,第一是参与递归调用的子目录不包括第(2)步中建立的子目录,否则会导致无穷递归;第二是在递归调用时,对于bookDir中的每一个子目录subDir,在srcDir中一定有一个对应的subDir子目录(拜第1步所赐),而递归调用的参数必需相对应。
现在,解决思路已经有了,到编码的时侯了,具体代码见下:
这里需要解释一下mk_dirs函数中的try...except模块,因为在同一个目录中可能存在两个文件名除了扩展名以外其他都一致的情况,比如如果在dir中同时存在file.ext1 file.ext2两个文件,则本程序将在试图在对应的源码目录中建立两个file目录,显然的,这会导致程序异常。
首先我认为两个同名文件(除了扩展名不的区别)如果处在同一个目录中,二者一定是相关的,因此,他们对应的源代码万全可以放入同一个目录,因此我简单的捕获异常然后pass了事。
TODO:
(1)如果本程序遇到没有扩展名的隐藏文件(因为unix-like系统中扩展名并无明确意义,这完全有可能),即类似.file或者.dir的形式,会导致无穷递归,目前推测可能是os.pash.splitext没有作相应的检测所致。
(2)或许定义一个函数用于处理main函数中bookDir本级目录会比较合适,这样list_dir就不用返回三个链表了,只需返回目录名供下一步递归调用即可
要学习这些书籍(其实大部分我都没看过),当然离不开动手练习,到这里的时候,我的做法就不那么科学了,甚至有点恶心,翻开我的home目录看看就知道了。在我的home目录下,有一个src/exec目录,里面有一堆自己的练习(不过这个里面倒是按照书本名字组织好的),另外有一个script /exec目录,里面也有一堆自己的练习,而在study目录(我的电子书们就放在study/e_book目录中)下,还有一个叫exec的目录,里面也有一堆练习……每当我打开一本看过一半的电子书,想动手试一试的时候,总觉得要面对异常噩梦,因为我不知道自己以前读这本书时将代码撂哪了,于是开始一顿乱找……
好了,罗嗦这么多,该进入正题了。现在我准备改变这种情况干这样一件事,建立一个总的src_exec目录,里面的子目录层次完全按照放置电子书的目录中的结构来组织,比如说假如我有如下的电子书目录:
e_book:
prog:
book1.pdf
book2.chm
bash:
book3.pdf
book4.chm
现在我要建立一个这样的练习目录(book1/book2/book3/book4均为目录名):
src_exer:
prog:
book1:
book2:
bash:
book3:
book4:
然后把e_book目录重新组织成以下形式:
e_book:
prog:
book1:
src
book1.pdf
book2:
src
book2.pdf
bash:
book3:
src
book3.pdf
book2:
src
book3.pdf
其中src为到src_exer中相应目录的软链接
上面就是我的需求
这个问题用递归解决是最自然不过了,我要首先将问题交付给main函数(此main不同于c中的main,只是我习惯了这么写而已),其接口如下:
main(bookDir, srcDir)
(1) 因为在bookDir中,有可能有文件,也可能有子目录。对于子目录来说,我们需要在srcDir中建立相应的子目录,以形成相同的结构,而对于文件,我需要以不含后缀的文件名在srcDir中建立子目录,来放置本电子书对应的练习代码。
根据上面的论述,对于bookDir中的任意项目(包括目录和文件),我们都需要在srcDir中建立相应的目录,唯一需要注意的是,对于建立与文件对应的目录时,我们需要去掉扩展名。
(2) 接下来我们需要改变bookDir中文件名的路径,对每一个bookDir/file.ext,我需要建立bookDir/file目录,然后将file.ext移至新建立的bookDir/file目录,再在bookDir/file目录中建立到srcDir/file/(该目录已经在第1步中建立)的链接,这里我用的是符号链接,至于为什么不建立硬链接,我也不知道,如果你有好的理由,欢迎探讨
(3) 到第(2)步结束时,bookDir/目录中的工作已经完成,该对bookDir/中的子目录调用main(bookDir/subDir, srcDir/subDir)了,这里有两个需要注意的地方,第一是参与递归调用的子目录不包括第(2)步中建立的子目录,否则会导致无穷递归;第二是在递归调用时,对于bookDir中的每一个子目录subDir,在srcDir中一定有一个对应的subDir子目录(拜第1步所赐),而递归调用的参数必需相对应。
现在,解决思路已经有了,到编码的时侯了,具体代码见下:
|
这里需要解释一下mk_dirs函数中的try...except模块,因为在同一个目录中可能存在两个文件名除了扩展名以外其他都一致的情况,比如如果在dir中同时存在file.ext1 file.ext2两个文件,则本程序将在试图在对应的源码目录中建立两个file目录,显然的,这会导致程序异常。
首先我认为两个同名文件(除了扩展名不的区别)如果处在同一个目录中,二者一定是相关的,因此,他们对应的源代码万全可以放入同一个目录,因此我简单的捕获异常然后pass了事。
TODO:
(1)如果本程序遇到没有扩展名的隐藏文件(因为unix-like系统中扩展名并无明确意义,这完全有可能),即类似.file或者.dir的形式,会导致无穷递归,目前推测可能是os.pash.splitext没有作相应的检测所致。
(2)或许定义一个函数用于处理main函数中bookDir本级目录会比较合适,这样list_dir就不用返回三个链表了,只需返回目录名供下一步递归调用即可
相关阅读 更多 +