Python里的生成器

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,以后慢慢完善。

Avatar_small
Lox 说:
2010年12月11日 01:38

《可爱的Python》上面给的也是这个解决方案。

不过我还是更喜欢用os.system调用Shell find命令这种方式。

Avatar_small
swofford 说:
2010年12月13日 08:56

@Lox: 1 walk()确实是从《可爱的Python》上学的
2 之前看过你的文章,os.system调用shell find应该是Linux上的吧,Windows上有类似解决方案么?
3 《可爱的python》上的中文编码问题,在Windows上快把我搞疯了,说ubuntu上都是 utf8 编码,应该没中文的问题吧?

Avatar_small
Lox 说:
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一统江湖吧。

Avatar_small
Lox 说:
2010年12月13日 10:44

Python 3.0好像统一采用UTF-8了。不再采用ASCII。印象中是这样。

Avatar_small
swofford 说:
2010年12月13日 11:06

@Lox: 1 windows 上的dos怎么调用法……我都是用 everything,当然对付复杂条件的搜索肯定不如find了
2 曾经也看过有人说 py3.0 的字符统一了
3 《可爱的Python》上的那个编码的问题就一直卡在那动不了,后面的都没看……

Avatar_small
Lox 说:
2010年12月14日 02:25

@swofford: everything是什么东东?dos下面也有find命令。os.system()如果在linux下,调用的就是linux shell命令。如果在windows下,调用的就是dos命令了。

Avatar_small
swofford 说:
2010年12月16日 08:46

@Lox: everything 是 win 下搜索文件用的,速度爆快,还有 ftp 的功能,但我没用过,不过它只能搜索 ntfs 分区的文件,而且不能搜索文件内的内容


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter