Python小程序
swofford
posted @ 2010年10月18日 11:51
in Python
, 7331 阅读
前段时间想学TeX的,记得以前下过一个TeXbook的压缩包,不过文件名忘了,只记得里面有.pdf和.tex的文件,就想用Python写个小程序找到这文件。
逻辑很简单,遍历磁盘文件,若后缀名为.zip(rar的没有处理,因为Python没直接处理它的库,后来网上搜了下,还是有处理rar的库的),则打开该文件,若压缩包内有文件后缀名为.tex,则打印出路径和文件名。
# -*- coding: utf-8 -*- import os, zipfile for root, dirs, files in os.walk('C:\\'): for x in (root, dirs, files)[2]: if x.endswith('.zip'): path = root+'\\'+x zf = zipfile.ZipFile(path, 'r') files = zf.namelist() for f in files: if f.endswith('.tex'): print f + ' in ' + path
这次碰到的问题主要有这么几个:
1 os.walk生成的数据的结构
os.walk()用于遍历一个目录中的根目录,目录,和文件。(root, dirs, files)[0]是根目录,(root, dirs, files)[1]是根目录下的子目录,(root, dirs, files)[2]是根目录下的所有文件列表,依次遍历,可以自己动手实验一下。
2 后缀的处理
可以用.endswith()或者也可以用in
3 文件路径的生成
因为要读取文件,所以得生成路径,一开始root+x,出错,百查不得其解,后来上csdn问才发现该加个'\\',更好的办法是用os.path.join(),粗心啊粗心……
4 zipfile模块的使用
看文档
先写个简单版v0.1,以后慢慢完善。
2010年12月11日 01:38
《可爱的Python》上面给的也是这个解决方案。
不过我还是更喜欢用os.system调用Shell find命令这种方式。
2010年12月13日 08:56
@Lox: 1 walk()确实是从《可爱的Python》上学的
2 之前看过你的文章,os.system调用shell find应该是Linux上的吧,Windows上有类似解决方案么?
3 《可爱的python》上的中文编码问题,在Windows上快把我搞疯了,说ubuntu上都是 utf8 编码,应该没中文的问题吧?
2010年12月13日 10:43
@swofford: 1、《可爱的Python》做为饭后甜点确实很不错呢。
2、find是Linux上的工具。windows上的Dos命令可以调用,但是我相信应该没有find这么强大
3、ubuntu和各种linux都可以设定locale,指定系统的编码为UTF-8或者GBK,还有相关的时间日期格式,货币格式等等。但是中文也很烦的。
有个文件转码转码工具叫iconv,结合linux上的file命令可以实现初步的字符编码转换功能。不过这个也是比较烦的。
反正中文就是一个悲剧。还是期待有生之年能够看到Unicode一统江湖吧。
2010年12月13日 10:44
Python 3.0好像统一采用UTF-8了。不再采用ASCII。印象中是这样。
2010年12月13日 11:06
@Lox: 1 windows 上的dos怎么调用法……我都是用 everything,当然对付复杂条件的搜索肯定不如find了
2 曾经也看过有人说 py3.0 的字符统一了
3 《可爱的Python》上的那个编码的问题就一直卡在那动不了,后面的都没看……
2010年12月14日 02:25
@swofford: everything是什么东东?dos下面也有find命令。os.system()如果在linux下,调用的就是linux shell命令。如果在windows下,调用的就是dos命令了。
2010年12月16日 08:46
@Lox: everything 是 win 下搜索文件用的,速度爆快,还有 ftp 的功能,但我没用过,不过它只能搜索 ntfs 分区的文件,而且不能搜索文件内的内容