6.4.2 案例精选
Posted Avention
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ‘‘‘
以上是关于6.4.2 案例精选的主要内容,如果未能解决你的问题,请参考以下文章