Python 电子邮件检查器-为什么我的程序输出错误? 导入字符串 #导入字符串以加载字典 d=dict.fromkeys(string.ascii_字母,0) ds=dict.fromkeys(string.digits,0) #2本进口字典,字母和数字(数字) f={**d,**ds,“.”:0} #将两本词典以及“.”合并在一起,因为没有具体的 字典。 尽管如此: `email=input(“输入文件名(必须是.txt文件)”) 文件=打开(str(电子邮件),“r”) 对于文件中的行: 就我而言: 如果行中有“”: 打印(第行,“找到的空间”) 打破 如果“@”不在同一行: 打印(第行,“电子邮件需要@”) emailzero=line.split(“@”) 如果len(emailzero)

Python 电子邮件检查器-为什么我的程序输出错误? 导入字符串 #导入字符串以加载字典 d=dict.fromkeys(string.ascii_字母,0) ds=dict.fromkeys(string.digits,0) #2本进口字典,字母和数字(数字) f={**d,**ds,“.”:0} #将两本词典以及“.”合并在一起,因为没有具体的 字典。 尽管如此: `email=input(“输入文件名(必须是.txt文件)”) 文件=打开(str(电子邮件),“r”) 对于文件中的行: 就我而言: 如果行中有“”: 打印(第行,“找到的空间”) 打破 如果“@”不在同一行: 打印(第行,“电子邮件需要@”) emailzero=line.split(“@”) 如果len(emailzero),python,Python,下面是我的程序的功能。它接收一个电子邮件文件并逐个检查它是否有效 问题是,当我加载一个包含多封电子邮件的列表时,第一封邮件之后的所有电子邮件都会说“该电子邮件不得包含域中的任何无效字符。” 有人能告诉我为什么会发生这种情况以及我如何解决它吗 干杯,如果“@”不在第行,你需要给每一行加一个缩进,我想。当从文件中读取时,你的行将以某种新行字符结尾(\r\n或\n)。如果要逐行分析,应确保删除该行的尾随空格和前导空格: import string # Imported string to load d

下面是我的程序的功能。它接收一个电子邮件文件并逐个检查它是否有效

问题是,当我加载一个包含多封电子邮件的列表时,第一封邮件之后的所有电子邮件都会说“该电子邮件不得包含域中的任何无效字符。”

有人能告诉我为什么会发生这种情况以及我如何解决它吗


干杯,

如果“@”不在第行,你需要给每一行加一个缩进,我想。

当从文件中读取时,你的行将以某种新行字符结尾(
\r\n
\n
)。如果要逐行分析,应确保删除该行的尾随空格和前导空格:

import string
# Imported string to load dictionaries

d = dict.fromkeys(string.ascii_letters, 0)
ds = dict.fromkeys(string.digits, 0)
# 2 dictionaries imported, letters and numbers(digits)

f = {**d, **ds, ".":0}
# Merged both dictionaries together as well as "." as there was no specific 
dictionary.

while True:
   `email = input("Enter the name of the file (must be .txt file)")
    file = open(str(email), "r")
    for line in file:
        for i in line:
            if " " in line:
                print(line, "Space found")
                break

        if "@" not in line:
            print(line, "The email needs @")

        emailzero = line.split("@")
        if len(emailzero) < 2:
            print(line, "@ and a domain symbol is needed")
            continue

        if emailzero[0] == "":
            print(line, "You must enter a name")

        if emailzero[1] == "":
            print(line, "A Domain is needed")

        if "." in emailzero[0]:
            print(line, "Only alphabet and numbers")

        for i in emailzero[0]:
            if i not in f:
                print(line, "The email must have a valid character before @")
                break

        if "." not in emailzero[1]:
            print(line, "The domain needs to contain a .")

        for i in emailzero[1]:
            if i not in f:
                print(line, "The email must not contain any invalid characters in the domain.")
                break

其他提示:

  • 关于这个片段:
  • 片段:

    emailzero = line.strip().split("@")
    
    你可以把这些浓缩成一组,像这样:

    d = dict.fromkeys(string.ascii_letters, 0)
    ds = dict.fromkeys(string.digits, 0)
    # 2 dictionaries imported, letters and numbers(digits)
    
    f = {**d, **ds, ".":0}
    
  • 以可读性较差的错误消息为代价,您可以将其压缩为一个简单的错误消息

  • 您的解析不接受所有有效的电子邮件地址(例如在
    @
    左侧包含
    +
    的电子邮件地址)。类似于
    email\u regex=re.compile(r'.+@.+\..+')
    的东西将是一个涵盖大多数用例的简单正则表达式(给定)


  • 请修复代码的缩进。目前,您的代码不是有效的Python,因为缩进是错误的。(有一个
    while
    循环和两个
    循环,其中下一行没有进一步缩进。)如果您的问题与缩进有关,并且您上面发布的代码与实际代码不包含相同的缩进,我们将尽力为您提供帮助。将打印段添加到代码中以便于调试。您的for循环/缩进看起来错误。你的意思是不是对文件中的每一行检查你正在检查的所有东西?现在它没有这样做。顺便说一句,即使这段代码工作正常,它仍然会给出不正确的结果,因为有些条件太窄,而另一些条件则丢失了。@请参阅显示您的问题的Post代码。您发布的代码引发了
    indicationerror
    @toxinishe,您在调试中付出了一些努力。只需打印(repr(line))
    即可显示答案。
    allowed_domain_chars = set(string.ascii_letters) | set(string.digits) | { '.' }