• 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:Usersdddd...PythonPython35  is: 159.8924 M Bytes  (167659363 Bytes)
    56 The total number of files in C:Usersdddd...PythonPython35 is: 6437
    57 The total number of directories in C:Usersdddd...PythonPython35 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:	est'
    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:	est')

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

     1 import openpyxl
     2 
     3 from openpyxl import Workbook
     4 
     5 fn = r'C:UsersddddDesktopaa.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:UsersddddDesktopaaa.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:UsersddddDesktopaaa.xlsx'
    85     newfile = r'C:UsersddddDesktopaaaa.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 '''
  • 相关阅读:
    (教程)怎么避免拼多多比价订单行为
    Ubuntu下搭建apache2+GGI环境
    搭建k8s
    我的2021年总结
    工作三年的一些感悟
    xshell6+xftp6免安装破解版
    centos7启动docker容器时提示Error response from daemon: Unknown runtime specified dockerrunc
    解决一个C#中定时任务被阻塞问题
    工程中实际问题解决两例——基于C#
    解决一次gitlab因异常关机导致启动失败
  • 原文地址:https://www.cnblogs.com/avention/p/8797451.html
Copyright © 2020-2023  润新知