Python中 for j in range(0, len(files)): NameError: name 'files' is not defined.


import win32com as win32
import win32com.client
import datetime, os
import xlrd
import re

"需要更改第20行"
"创建收件人姓名数组, 创建收件人邮箱地址数组, 创建需要被CC的邮件地址"
ReceiverNameArray = []
ReceiverMailArray = []
CcMailArray = []
MailTopicSubject = 'multi-mail send test'

"将excel中的sheet0内容读出"
readExcel = xlrd.open_workbook('ReceiversAddressList.xlsx')
readExcel.sheets()
readSheet = readExcel.sheet_by_index(0)

"从sheet里面提取所需要的: 创建收件人姓名数组, 创建收件人邮箱地址数组, 创建需要被CC的邮件地址"
for col in readSheet.get_rows():
    ReceiverName = col[0].value
    ReceiverNameArray.append(ReceiverName)
    ReceiverMail = col[1].value
    ReceiverMailArray.append(ReceiverMail)
    CcMail = col[2].value
    CcMailArray.append(CcMail)
"将每个数组的第一行剔除(也就是剔除excel中的第一行)"
del(ReceiverNameArray[0])
del(ReceiverMailArray[0])
del(CcMailArray[0])
"ReceiverNameArray内容数量与ReceiverMailArray内容数量进行比较"
NumberCheck = False
if len(ReceiverNameArray) == len(ReceiverMailArray) and len(ReceiverNameArray) > 0:
    NumberCheck = True  # check 成功
else:
    print("错误!!! 收件人数目与收件人邮箱数目不一致!!!")

"在MultiMailSend文件夹中找出文件名, 检查 ReceiverNameArray 的收件人是不是都能在该文件夹下找到对应的文件"
for root, dirs, files in os.walk('MultiMailSend'):
    print("MultiMailSend文件夹下的所有文件名: " + str(files)) #运行for函数找出MultiMailSend文件夹下所有的文件名
count = 0
for i in range(0, len(ReceiverNameArray)):
    for j in range(0, len(files)):
        if (bool(re.search(str(ReceiverNameArray[i]), str(files[j]))) == True):
            count = count + 1
FilesCheck = False
if count != len(ReceiverNameArray):
    print("错误!!! 收件人名称和附件名称不一致!!!")
else:
    FilesCheck = True

"发送多个邮件函数的实现"
class SendMultiEmail():
    def outlook(self):
        for i in range(0, len(ReceiverNameArray)):
            mail_path_content = os.path.join('MultiMailSend', 'Content.txt') # 邮件正文内容
            mail_path_attachment = os.path.join('MultiMailSend', ReceiverNameArray[i] + '.xlsx') #找到每个收件人对应的附件
            olook = win32.client.Dispatch("outlook.Application")  # 固定写法
            mail = olook.CreateItem(0)  # 固定写法
            mail.To = ReceiverMailArray[i]   # 收件人邮箱
            mail.CC = CcMailArray[i]         # 需要CC的邮箱
            mail.Subject = MailTopicSubject  # 邮件主题,
            mail.Attachments.Add(mail_path_attachment, 1, 1, ReceiverNameArray[i])  # 添加附件
            read = open(mail_path_content, encoding='utf-8')  # 邮件正文
            content = read.read()  # 读取测试报告文件中的内容
            read.close()
            mail.Body = content  # 将从报告中读取的内容,作为邮件正文中的内容
            mail.Send()  # 发送

"python程序的入口"
if __name__ == '__main__':
    if FilesCheck == True and NumberCheck == True:
        SendMultiEmail().outlook()
        print("发送成功 !!!!!!!!!!")
    else:
        print("发送失败 !!!!!!!!!!")

报错

C:\Users\jie.luo\venv\Scripts\python.exe "C:/Users/jie.luo/OneDrive - Thermo Fisher Scientific/Python/发邮件/Main.py"
Traceback (most recent call last):
  File "C:\Users\jie.luo\OneDrive - Thermo Fisher Scientific\Python\发邮件\Main.py", line 51, in <module>
    for j in range(0, len(files)):
NameError: name 'files' is not defined. Did you mean: 'filter'?

Process finished with exit code 1

请问这是什么问题,以及如何处理呢?

因为你的i和上面的
for root, dirs, files in os.walk('MultiMailSend'):
写在同一层了
并没有写在上层循环的里面
前面统一加4个空格