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 ‘‘‘
原文地址:https://www.cnblogs.com/avention/p/8797451.html