6.4.2 案例精选

  1 将当前目录的所有扩展名为html的文件重命名为扩展名为htm的文件。

 1 file_list = os.listdir('.')   #获取当前目录下的文件列表
 2 for filename in file_list:
 3     pos = filename.rindex('.')
 4     if filename[pos+1:] == 'html':
 5         newname=filename[:pos + 1] + 'htm'
 6         os.rename(filename,newname)
 7         print(filename + '更名为:' + newname)
 8 
 9 #下面的代码可能更简洁一点
10 file_list = [filename for filename in os.listdir('.') if filename.endswith('html')]
11 for name in file_list:
12     newname = name[:-4] + 'htm'
13     os.rename(name,newname)
14     print(filename + '更名为:' + newname)

 

  2 计算文件侧CRC32值

 1 import sys
 2 import zlib
 3 import os.path
 4 
 5 filename = sys.argv[0]   #第一个参数是文件名
 6 if os.path.isfile(filename):
 7     fp = open(filename,'rb')
 8     contents = fp.read()
 9     fp.close()
10     print(zlib.crc32(contents.encode()))
11 else:
12     print('file not exists')

  

  拓展知识:CRC又称循环冗余检查吗,常用于数据存储和通信领域,具有极强的检错能力。CRC32产生校验值时源数据快的每一个bit(位)都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的CRC32值,也可用于文件完整性保护。

 

  3 判断一个文件是否为GIF图像文件。任何一种文件都具有专门的文件头结构,在文件头中存放了大量的信息,其中就包括该文件的类型。通过文件头信息来判断文件类型的方法可以得到更加准确的信息,而不依赖于文件扩展名。

1 def is_gif(fname):
2     f = open(fname,'r')
3     first4 = tuple(f.read(4))
4     f.close()
5     print(first4)
6     return first4 == ('G','I','F','8')
7 
8 print(is_gif('test.gif'))

 

  4 编程程序,进行文件夹增量备份

  程序功能与用法:指定源文件夹与目标文件夹,自动检测自上次备份以来源文件夹中内容的改变,包括修改的文件、新建的文件、新建的文件夹等,自动复制新增或修改过的文件到目标文件夹中,自上次备份以来没有修改过的文件将被忽略而不复制,从而实现增量备份。本例属于系统运维的范畴。

 1 import os
 2 import filecmp
 3 import shutil
 4 import sys
 5 
 6 def autoBackup(scrDir,dstDir):
 7     if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir))
 8         or (os.path.abspath(scrDir) != scrDir) or (os.path.abspath(dstDir) != dstDir)):
 9         usage()
10 
11     for item in os.listdir(scrDir):
12         scrItem = os.path.join(scrDir,item)
13         dstItem = scrItem.replace(scrDir,dstDir)
14 
15         if os.path.isdir(scrItem):
16             #创建新增的文件夹,保证目标文件夹的结构与原始文件夹一致
17             
18             if not os.path.exists(dstItem):
19                 os.makedirs(dstItem)
20                 print('make directory',dstItem)
21 
22             #递归调用自身函数
23             autoBackup(scrDir,dstDir)
24 
25         elif os.path.isfile(scrItem):
26             #只复制新增或修改过的文件
27             if ((not os.path.exists(dstItem)) or (not filecmp.cmp(scrItem,dstItem,shallow=False))):
28                 shutil.copyfile(scrItem,dstItem)
29                 print('file:' + scrItem + '==>' + dstItem)
30 
31 def usage():
32     print('scrDir and dstDir must be existing absolute path of certain directory')
33     print('For example:{0} c:\\olddir c:\\newdir'.format(sys.argv[0]))
34     sys.exit(0)
35     
36     
37 if __name__ == '__main__':
38     if len(sys.argv) != 3:
39         usage()
40     scrDir,dstDir = sys.argv[1],sys.argv[2]
41     autoBackup(scrDir,dstDir)

 

   5 编写程序,统计指定文件夹大小以及文件和子文件夹数量。本例也属于系统运维范畴,可用于磁盘配额的计算,例如 E-mail、博客、FTP、快盘等系统中每个账号所占空间大小的统计。

 

 1 import os
 2 
 3 totalSize = 0
 4 fileNum = 0
 5 dirNum = 0
 6 
 7 def visitDir(path):
 8 
 9     global totalSize
10     global fileNum
11     global dirNum
12 
13     for lists in os.listdir(path):
14         sub_path = os.path.join(path,lists)
15         if os.path.isfile(sub_path):
16             fileNum +=  1                             #统计文件数量
17             totalSize += os.path.getsize(sub_path)    #统计文件总大小
18 
19         elif os.path.isdir(sub_path):
20             dirNum += 1                               #统计子文件的数量
21             visitDir(sub_path)                        #递归统计子文件夹
22 
23 def main(path):
24     if not os.path.isdir(path):
25         print('Error:"',path,'" is not a directory or does not exist.')
26         return
27 
28     visitDir(path)
29 
30 #单位换算函数
31 def sizeConvert(size):
32     K,M,G = 1024,1024 ** 2,1024 ** 3
33     if size >= G:
34         return '{:.4f}'.format(size / G) + ' G Bytes'
35 
36     elif size >= M:
37         return '{:.4f}'.format(size / M) + ' M Bytes'
38 
39     elif size >= K:
40         return '{:.4f}'.format(size / K) + ' K Bytes'
41     else:
42         return str(size) + 'Bytes'
43 
44 def output(path):
45     print('The total size of {}  is: {}  ({} Bytes)'.format(path ,sizeConvert(totalSize),totalSize))
46     print('The total number of files in ' + path + ' is:',fileNum)
47     print('The total number of directories in ' + path + ' is:',dirNum)
48 
49 if __name__ == '__main__':
50     path = os.getcwd()
51     main(path)
52     output(path)
53 
54 '''
55 The total size of C:\Users\dddd\...Python\Python35  is: 159.8924 M Bytes  (167659363 Bytes)
56 The total number of files in C:\Users\dddd\...Python\Python35 is: 6437
57 The total number of directories in C:\Users\dddd\...Python\Python35 is: 624
58 '''

 

 

  6 编写程序,递归删除指定文件夹中指定类型的文件。

   本例代码也属于系统运维范畴,可用于清理系统中的临时垃圾文件或其他指定类型的文件,稍加扩展还可以删除大小为0字节的文件,大家可以自行补充和完成。

 1 from os.path import isdir,join,splitext
 2 from os import remove,listdir
 3 
 4 #指定要删除的文件类型
 5 filetypes = ['.tmp','.log','.obj','.txt']
 6 
 7 def delCertainFiles(directory):
 8 
 9     if not isdir(directory):
10         print('应该输入路径')
11         return
12 
13     for filename in listdir(directory):
14         print(3)
15 
16         temp = join(directory,filename)
17 
18         if isdir(temp):
19             delCertainFiles(temp)
20 
21         elif splitext(temp)[1] in filetypes:
22             print(5)
23             remove(temp)
24             print(temp,'deleted...')
25 
26 if __name__ == '__main__':
27     directory = r'E:\test'
28     #directory = sys.argv[1]
29     delCertainFiles(directory)

 

  如果文件夹中有带特殊属性的文件或子文件夹,上面的代码可能会无法删除带特殊属性的文件,利用Python扩展pywin32可以解决该问题。

 1 import win32con
 2 import win32api
 3 import os
 4 from win32con import FILE_ATTRIBUTE_NORMAL
 5 
 6 def del_dir(path):
 7     for file in os.listdir(path):
 8         file_or_dir = os.path.join(path,file)
 9         if os.path.isdir(file_or_dir) and not os.path.islink(file_or_dir):
10             del_dir(file_or_dir)
11 
12         else:
13             try:
14                 os.remove(file_or_dir)    #尝试删除该文件
15             except:
16                 win32api.SetFileAttributes(file_or_dir,FILE_ATTRIBUTE_NORMAL)   #修改文件属性,设置为普通文件,再次删除
17                 os.remove(file_or_dir)
18 
19     os.rmdir(path)   #删除文件夹
20 
21 del_dir(r'E:\test')

 

  7 使用扩展库 openpyxl 读写 Excel 2007 以及更高版本的Excel 文件。

 1 import openpyxl
 2 
 3 from openpyxl import Workbook
 4 
 5 fn = r'C:\Users\dddd\Desktop\aa.xlsx'   #文件名
 6 wb = Workbook()                         #创建工作簿
 7 ws = wb.create_sheet(title='你好')      #创建工作表
 8 ws['A1'] = '这是第一个单元格'             #单元格复制
 9 ws['B1'] = '3.1415926'
10 wb.save(fn)                             #保存Excel
11 
12 wb = openpyxl.load_workbook(fn)         #打开指定索引的工作表
13 ws = wb.worksheets[1]                   #打开第二个sheet页
14 print(ws['A1'].value)                   #读取并输出指定单元格的值
15 ws.append([1,2,3,4,5])                  #添加一行数据
16 ws.merge_cells('F2:F3')                 #合并单元格
17 ws['F2'] = "=sum(A2:E2)"                #写入公式
18 
19 for r in range(10,15):
20     for c in range(3,8):
21         _=ws.cell(row=r,column=c,value=r*c)  #写入单元格数据
22 wb.save(fn)

 

  假设某学校所有课程每学期允许多次考试,学生可随时参加考试,系统自动将每次成绩添加到Excel文件(包含 3 列:姓名、课程、成绩)中,现期末要求统计所有学生每门课程的最高成绩。下面的代码首先模拟生成随机成绩数据,然后进行统计分析。

 1 import openpyxl
 2 from openpyxl import Workbook,load_workbook
 3 import random
 4 
 5 def generateRandomInformation(filename):
 6     workbook = Workbook()
 7     worksheet = workbook.worksheets[0]
 8 
 9     worksheet.append(['姓名','课程','成绩'])
10 
11     #中文名字中的第一、第二、第三个字
12     first = tuple('赵钱孙李')
13     middle = tuple('为为为为')
14     last = tuple('坤燕只')
15 
16     #课程名称
17     subjects = ('语文','数学','英语')
18 
19     #数据生成200个数据
20     for i in range(200):
21         line = []
22         r = random.randint(1,100)
23         name = random.choice(first)
24 
25         #按一定概率生成只有两个字的中文名字
26 
27         if r > 50:
28             name += random.choice(middle)
29         name += random.choice(last)
30 
31         #依次生成姓名、课程名称和成绩
32         line.append(name)
33         line.append(random.choice(subjects))
34         line.append(random.randint(0,100))
35 
36         worksheet.append(line)
37 
38     #保存数据,申城EXCEL 2007格式的文件
39     workbook.save(filename)
40 
41 #generateRandomInformation(r'C:\Users\dddd\Desktop\aaa.xlsx')  #这行代码执行一次就可以了
42 
43 def getResult(oldfile,newfile):
44 
45     #用于存放结果数据的字典
46     result = dict()
47 
48     #打开原始数据
49     workbook = load_workbook(oldfile)
50     worksheet = workbook.worksheets[0]
51 
52     #遍历原始数据
53     #跳过第0行的表头
54     for row in worksheet.rows[1:]:
55 
56         #姓名、课程名称、本次成绩
57         name,subject,grade = row[0].value,row[1].value,row[2].value
58 
59         #获取当前姓名对应的课程名称和成绩信息
60 
61         #如果result字典中不包含,则返回空字典
62         t = result.get(name,{})
63 
64         #获取当前学生当前课程的成绩,若不存在返回0
65         f = t.get(subject,0)
66 
67         #只保留该学生该课程的最高成绩
68         if grade > f:
69             t[subject] = grade
70             result[name] = t
71 
72     #创建Excel文件
73     workbook1 = Workbook()
74     worksheet1 = workbook1.worksheets[0]
75     worksheet1.append(['姓名','课程','成绩'])
76 
77     #将result 字典中的结果数据写入 Excel 文件
78     for name,t in result.tiems():
79         for subject,grade in t.items():
80             worksheet1.append([name,subject,grade])
81     workbook1.save(newfile)
82 
83 if __name__ == '__main__':
84     oldfile = r'C:\Users\dddd\Desktop\aaa.xlsx'
85     newfile = r'C:\Users\dddd\Desktop\aaaa.xlsx'
86 
87     getResult(oldfile,newfile)

 

  8 编写代码,查看指定ZIP和RAR压缩文件中的文件列表。

  Python标准库zipfile提供了对ZIP和APK文件的访问。

1 import zipfile
2 fp = zipfile.ZipFile(r'')
3 for f in fp.namelist():
4     print(f)
5 fp.close()

 

  Python扩展库rarfile(可通过pip工具进行安装)提供了对RAR文件的访问。

1 import rarfile
2 r = rarfile.RarFile(r'')
3 for f in r.namelist():
4     print(f)
5 r.close()

 

  9 把记事本文件 test.txt转换成 Excel 2007 + 文件,假设test.txt文件中国第一行为表头,从第二行开始是实际数据,并且表头和数据航中的额不同字段信息都是用逗号分隔。

 1 from openpyxl import Workbook
 2 
 3 def main(txtFileName):
 4     new_XlsFileName = txtFileName[:-3] + 'xlsx'
 5 
 6     wb = Workbook
 7     worksheet = wb.worksheets[1]
 8 
 9     with open(txtFileName) as fp:
10         for line in fp:
11             line = line.strip().split(',')
12             worksheet.append(line)
13         wb.save(new_XlsFileName)
14 
15 main('infomation.txt')
16 
17 '''
18 Traceback (most recent call last):
19   File "C:/Users/dddd/AppData/Local/Programs/Python/Python35/test1.py", line 15, in <module>
20     main('infomation.txt')
21   File "C:/Users/dddd/AppData/Local/Programs/Python/Python35/test1.py", line 7, in main
22     worksheet = wb.worksheets[1]
23 TypeError: 'property' object is not subscriptable
24 '''
posted @ 2018-04-12 20:22  Avention  阅读(865)  评论(0编辑  收藏  举报