Python 是一种简洁优美的脚本语言,它的诸多优点使它在完成某些任务时轻松自如。本文通过几个具体的例子阐明了这一点。
字串2
关于Python
字串3
Python 是一种简洁优美的编程语言,它具有面向对象的特征,较好的粘合其他语言的能力及跨平台性。然而我认为同样重要的是, 它简单易学,书写代码简洁快速。此外,Python 提供了较多的模快,包含了相当多的功能,所以只要有一个可行的想法,那么用 Python 解决起来会是比较容易的。下面几个例子都源于我遇到的一些实际问题。借助于 Python,这些问题的解决都显得轻而易举。
字串9
自动删除某些文件 字串8
某些软件在工作时会自动生成一些备份文件。比如我用 Vim 做文本编辑,用 Autocad 绘图时,这些程序都会自动生成一些备份的文件。随着文件数量的增长,每隔一段时间就要清理一下。当然可以选择手工清理,不过考虑到这些文件是分散在不同的目录下,而且数量比较多,所以手工清理还是有些麻烦。于我写了一个简单的 Python 脚本来自动完成这一任务。下面这段代码扫描D盘下的所有目录,并删除目录下的有关备份文件: 字串1
from os.path import walk, join, normpath
from os import chdir, remove
def scan(arg, dirname, names)
for file in names:
1 if file[-1:]=="~" or file[-4:]==".bak":
2 files = normpath(join(dirname,file))
3 chdir(dirname)
4 print "deleting", files
5 remove(file)
6 print "done!"
if __name__== "__main__":
path = chdir('d:\\')
7 walk(path, scan, 0) 对以上代码的简单分析和解释:
字串4
基本的想法是利用脚本对各个目录进行扫描,对目录下每一个文件进行判断(1句),如果是某个程序生成的备份文件就删除掉(5句)。 字串5
备份文件的扩展名都有一定的特征,比如 Vim 备份文件的最后一个字符是波浪号~,而 Autocad 的备份则以 bak 结束。这些特征是判断一个文件是否应该被删除的依据。
字串5
7 句 walk(path, scan, 0) 是一个 Python 的内置函数。用来遍历目录 path。显而易见借助于 Python 提供的这个函数,扫描目录的工作比较轻松地完成了,从而使编程的难度降低许多。
最后要说明的一点是,删除某个文件时要知道它的绝对路径而且要在那个文件的所在目录下进行,否则 Python 会提示找不到要处理的文件。2 句得到了文件的绝对路径,3 句 chdir(dirname) 则把当前的目录变成要删除文件的所在目录。 字串4
提取嵌入在文档中的图像 字串8
这个问题的提出也是来自实际的需要。 我在阅读与课题有关的各种格式的电子文档时,有时发现包含在文档里面的图像很有用,因为这些图像可以在论文或报告中直接引用, 所以最好能把它们保存下来。 在 Linux 下工作时我用过 Pdfimages,那是一个从 PDF 文档中提取图像的工具。但我希望能找到一个工具可以同时快速处理不同格式的文档,而且能在 Windows 下工作。感 谢 Python,它使我能用比较简单的代码去实现这样一个工具。 字串8
基本的想法是先读取要处理的文档,然后在其中找到图像部分。因为各种图像在起始部分都包含了自己的标识。比如JPEG图像的标识是JFIF,PNG的是PNG。找到这些标识后读取包含这个图像的相应字节,再把它以二进制格式保存下来.根据这个想法,代码可以分为两部分:寻找图像和保存图像。下面的这两段代码用来从一个PowerPoint文档NORFA_COD.ppt中提取图像,其中第一部分的代码如下:
import sys
import os
import string
1 headers=[("JFIF", 6, "jpg"), ("GIF", 0, "gif"), ("PNG", 1, "png")]
2 marker=[]
3 filename = "d:\\article\\ppt\\NORFA_COD.ppt"
try:
4 fid = open(filename, 'rb')
except:
5 sys.exit(1)
6 numlin = len(fid.readlines())
7 fid .seek(0)
8 i = 0; s = 0
9 curlin = fid.readline()
while i < numlin:
for flag, offset, ext in headers:
10 index = string.find(curlin, flag)
if index < 0:
11 continue
else:
12 pos = s index -offset
13 marker.append((pos, ext))
14 s = s len(curlin)
15 curlin = fid.readline()
16 i = 1 字串1 以上代码首先把要处理的文件以二进制格式逐行读入(9句),然后在其中寻找有没有包含1句headers里的图像标识。如果没有找到,就读取下一行(11句)。如果发现的话,就把图像的起始位置和标识记录在一个字典marker里(12-13句)。在扫描完整个文档后,可以得到一个包含图像信息的字典marker。 字串7
有了marker里的信息,就可以进行图像的保存工作了。这部分的代码是: 字串8
17 fid.seek(0)
18 j = len(marker)
19 imgnum = 0
if j == 0:
20 print "No images included in the document"
21 sys.exit(1)
for i in range(0, j):
22 if i == j-1:
23 info = marker[i]
24 thispos = info[0]
25 thisext = info[1]
26 nextpos = s
27 gap = nextpos - thispos
28 fid.seek(thispos)
29 data = fid.read(gap)
30 imgname = "imgnamed.%s" % (i, thisext)
31 fid1 = open(imgname, 'wb')
32 fid1.write(data)
33 fid1.close()
34 imgnum = 1
else:
35 info = marker[i]
36 thispos = info[0]
37 thisext = info[1]
38 nextinfo = marker[i 1] ![我要研发网[www.51dev.com]](/templets/images/toplogo.gif)
