[Notes d'étude] Python Office Automation - Tâche 01 Traitement automatique des fichiers et envoi automatique d'e-mails

Dans ce processus d'apprentissage, j'essaie principalement d'utiliser la pratique au lieu de copier, et d'utiliser et de maîtriser diverses méthodes de fonctionnement de base dans le processus de codes d'écriture manuscrite pour résoudre des problèmes spécifiques.
Cette note enregistre principalement les idées, les problèmes rencontrés et les solutions lors du codage pour résoudre les exercices.

Problème 1 : Générer des questionnaires aléatoires de quiz
Supposons que vous êtes un professeur de géographie avec 35 élèves dans votre classe et que vous souhaitez donner un quiz sur les capitales des États américains. Malheureusement, avec quelques méchants dans la classe, vous ne pouvez pas être sûr que les élèves ne tricheront pas. Vous voulez mélanger l'ordre des questions afin que chaque test soit unique afin que personne ne puisse copier les réponses de quelqu'un d'autre. Bien sûr, le faire à la main prend du temps et est ennuyeux. Heureusement, vous connaissez un peu Python.

import os
import random

#America 各州对应首府字典
capitals = {
    
    'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix',
'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver',
'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee',
'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois':
'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas':
'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine':
'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan':
'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri':
'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada':
'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton', 'New Mexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City',
'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence',
'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee':
'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont':
'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia', 'West Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}

# 获取各州和对应首府的名称列表
questions = list(capitals.keys())
answers = list(capitals.values())

#创建存放试卷和答案的文件夹
if os.path.exists('./papers')==False:
    os.makedirs('./papers')
if os.path.exists('./keys')==False:
    os.makedirs('./keys')

#为第stu(1-35)位同学生成试卷
for stu in range(1,36):
    random.shuffle(questions)
    #新建试卷文件paper[stu]和对应答案文件key
    paper_name = 'paper['+str(stu)+'].txt'
    key_name = 'key['+str(stu)+'].txt'
    paper = open(os.path.join('./papers',paper_name),'w',encoding='utf-8')
    key = open(os.path.join('./keys',key_name),'w',encoding='utf-8')
    #向paper写入50道试题和对应选项
    for i in range(1,51):
        paper.write(str(i)+'.where is the capital of '+questions[i-1]+'?\n')  #第i个题目
        sele_num = ['A','B','C','D']                #选项序号
        selections = []                             #选项内容列表
        right_ansewer = capitals[questions[i-1]]    #正确答案
        selections.append(right_ansewer)            #将正确答案加入选项列表

        # # 在控制台输出题目和正确答案
        # print(str(i)+'.where is the capital of '+questions[i-1]+'?')
        # print('answer is:'+right_ansewer+'\n')
		
		#随机打乱答案顺序
		random.shuffle(answers)
        #添加3个随机错误答案进入选项列表
        for _ in range(0,50):
            if len(selections) == 4:
                break
            if answers[_] != right_ansewer:
                selections.append(answers[_])
        random.shuffle(selections)  #打乱答案排序
        right_ansewer_num = selections.index(right_ansewer)     #保存正确答案序号
        #输出4个选项
        for _ in range(0,4):
            paper.write(sele_num[_]+'.'+selections[_]+'\n')
        #向答案文件中写入第i题的答案
        key.write('第'+str(i)+'道题答案为:'+sele_num[right_ansewer_num]+'\t'+right_ansewer+'\n')
    #关闭试卷和答案文件
    paper.close()
    key.close()
1. Idées de sujets :
(1) Créez d'abord deux listes de questions (noms d'état) et de réponses (noms majuscules).
(2) Avant de générer chaque papier de test, mélangez la liste des questions, puis générez 50 questions dans l'ordre.
(3) Chaque fois qu'une question est générée, mélangez la liste de réponses, créez une liste d'options (y compris 4 réponses, trouvez-en une correcte dans le dictionnaire et trouvez 3 mauvaises selon la liste de réponses) et brouillez la liste d'options .
(4) Trouvez le numéro de série de la bonne réponse dans la liste de réponses et écrivez-le dans le fichier de réponses du papier de test correspondant.

2. L'utilisation de barres obliques et de barres obliques inverses comme séparateurs de chemin locaux :
(1) Barre oblique : [/] [peut être enregistré comme une barre oblique avec une pente positive]      ne peut être utilisé que dans Windows
         barre oblique inverse : [\] [peut être enregistré comme une barre oblique avec une pente négative]     peut être utilisé dans Windows et Unix
(2) En programmation Python, nous pouvons utiliser directement toutes les barres obliques [/] pour diviser le chemin d'adresse, comme `D:/Python/data`, qui peut être utilisé sur les plates-formes Windows et Unix. Si vous utilisez une barre oblique inverse [\] pour marquer le chemin dans l'environnement Windows, vous devez utiliser des doubles barres obliques inverses telles que `D:\\Python\\data`, dont la première est utilisée pour l'échappement.

Sujet 2 : Générer des fichiers de quiz aléatoires
Écrivez un programme qui parcourt une arborescence de répertoires à la recherche de fichiers avec une extension spécifique (telle que .pdf ou .jpg). Où que se trouvent ces fichiers, copiez-les dans un nouveau dossier.

import os
import shutil

rootPath = 'F:\\pycharm\\work\\OfficeAutomation'    #设置遍历根路径
fileType = 'txt'                                    #设置遍历文件后缀类型
destination = 'F:\\copy'                            #设置文件复制后地址
for curFolder,subFolder,files in os.walk(rootPath):
    # print('The current folder is ' + curFolder)
    for file in files:
        if(file.split('.')[-1]==fileType):
            print("copy "+os.path.join(curFolder,file)+" to "+destination+"...")
            shutil.copy(os.path.join(curFolder,file),destination)



1. Idées de sujets :
(1) Utilisez os.walk() pour parcourir chaque fichier dans le répertoire racine et les sous-répertoires
(2) Utilisez la méthode split de chaîne split pour diviser le nom du suffixe, si nécessaire, copiez le fichier dans le fichier correspondant via la méthode shutdown.copy Position cible

2. Le dossier cible dans la destination est mieux généré manuellement à l'avance, sinon il deviendra un document inconnu sans suffixe après sa copie.
3. Veillez à ne pas définir la destination sous le rootPath, sinon les fichiers qui viennent d'être copiés seront également parcourus, ce qui entraînera l'erreur de shutdownil.SameFileError signalé lors de la copie vers l'emplacement d'origine


Sujet 3 : Il n'est pas rare que certains fichiers ou dossiers inutiles et volumineux occupent de l'espace sur le disque dur. Si vous essayez de libérer de l'espace sur votre ordinateur, la suppression des fichiers volumineux indésirables fonctionne mieux. Mais vous devez d'abord les trouver. Écrivez un programme qui parcourt une arborescence de répertoires à la recherche de fichiers ou de dossiers particulièrement volumineux, disons, de plus de 100 Mo (rappelez-vous que pour obtenir la taille d'un fichier, vous pouvez utiliser le module os) os.path.getsize(). Affiche les chemins absolus de ces fichiers à l'écran.

import os
import send2trash

rootPath = 'F:\\pycharm\\work\\OfficeAutomation'    #设置遍历根路径
threshold = pow(2,20)*100                           #删除大于阈值(100M)的文件

for curFolder,subFolder,files in os.walk(rootPath):
    for file in files:
        fileSize = os.path.getsize(os.path.join(curFolder,file))
        if(fileSize>threshold):
            print("The size of "+os.path.join(curFolder,file)+" is "+str(fileSize)+",which > "+str(threshold)+" , deleting...")
            send2trash.send2trash(os.path.join(curFolder,file))



1. Idées de sujets :
(1) Utilisez os.walk() pour parcourir chaque fichier dans le répertoire racine et les sous-répertoires
(2) Utilisez la méthode os.path.getsize() pour juger de la relation entre la taille du fichier et le seuil défini, s'il est supérieur à le seuil, imprimer et supprimer

2. L'unité de taille de fichier obtenue par la méthode os.path.getsize() est l'octet. L'unité que nous utilisons habituellement est 1 Mo = 2 ^ 10 Ko = 2 ^ 20 octets. Faites attention à la relation de conversion lors de la comparaison.


Sujet 4 : Écrire un programme pour trouver tous les fichiers avec un préfixe spécifié dans un dossier, comme spam001.txt, spam002.txt, etc., et localiser le numéro manquant (par exemple, spam001.txt et spam003.txt existent, mais pas spam002.txt). Demandez au programme de renommer tous les fichiers suivants, en éliminant les numéros manquants. Comme défi supplémentaire, écrivez un autre programme qui, parmi les fichiers numérotés consécutivement, laisse certains numéros vides afin que de nouveaux fichiers puissent être ajoutés.

import os
import shutil

rootPath = 'F:\\pycharm\\work\\OfficeAutomation\\files'    #设置遍历根路径
prefix = 'spam'                                            #设置文件名前缀
fileList = []                                              #旧文件名列表
fileList_New = []                                          #新文件名列表

# #生成测试文件
# for i in range(11,21):
#     file = open(os.path.join(rootPath,'spam{:03d}.txt'.format(i)),'w')
#     file.write('Name of this file is spam{:03d}.txt'.format(i))
# file.close()

count = 1

for name in os.listdir(rootPath):                           #遍历rootPath下所有文件或文件夹
    if os.path.isfile(os.path.join(rootPath,name)):         #找到文件类型的文件(非文件夹)
        if name.startswith(prefix):                         #将所有含有前缀名的文件名加入旧列表
            fileList.append(name)
            newName = prefix+'{:03d}'.format(count)+'.txt'  #将当前文件的正确文件名加入新列表
            fileList_New.append(newName)
            count+=1
fileList.sort()                                             #将旧文件名列表排序

#将错误序号之后的所有文件夹重命名为正确的文件名
for old,new in zip(fileList,fileList_New):
    if(old!=new):
        print("change the name ["+old+"] to ["+new+"]")
        shutil.move(os.path.join(rootPath,old),os.path.join(rootPath,new))



1. Idées de sujets :
(1) Utilisez os.listdir() pour obtenir tous les fichiers du chemin actuel (à l'exception des dossiers)
(2) Si le fichier correspond au nom du préfixe, il sera ajouté à l'ancienne liste de noms et le nom correct correspondant au fichier sera ajouté à la nouvelle liste de noms
( 3) Parcourez les anciennes et les nouvelles listes de fichiers et utilisez la méthode shutdown.move pour corriger le nom s'ils ne sont pas égaux.

2. for a,b in zip(X,Y) est une méthode de parcours courante qui peut améliorer l'efficacité et peut être davantage utilisée à l'avenir.


Je suppose que tu aimes

Origine blog.csdn.net/qq_41794040/article/details/117966446
conseillé
Classement