【问题标题】:Python- Reading and Appending a FilePython-读取和附加文件
【发布时间】:2015-07-20 08:03:12
【问题描述】:

我正在尝试创建一个程序,该程序要求用户输入“名称”并检查以确保名称是字母顺序,不会太长,并且不在名为 Unacceptable_Names 的文件中(包含不适当的名称)

为确保程序的每个用户不使用相同的名称,当玩家输入名称时,我将其附加到 Unacceptable_Names,然后当下一个玩家玩时,如果他们在这个文件。

下面的代码适用于文件中已经创建的单词,但是当我重播并输入相同的名称时,我没有收到错误。有人可以帮助解决为什么没有检查名称吗?

def Char_Name(self,name):
    string1=str(name).lower()
    unacceptable_names=open("C://Users//Documents//Unacceptable_Names.txt", "r")
    unacceptable_names2=open("C://Users//Documents//Unacceptable_Names.txt", "a")
    names_list= []
    for line in unacceptable_names.readlines():
        for i in line.split(","):
            names_list.append(i.strip())
    if name.isalpha()==False:
        print("You entered a name containing non-alphabetic characters, pease reenter a new name:")
        main()
    elif len(name)>=10:
        print("You entered a name containing 10 or more characters, pease reenter a new name:")
        main()
    elif string1 in names_list:
        print("You entered a name containing bad words or a name already in use! Try again.")
        main()
    else:
        unacceptable_names2.write("\n"+str(name)+",")
        unacceptable_names2.close()
        self.character_name=name

这是 unacceptable_names 在输入名字“Emily”后的样子:[以及之前文件中的一些其他坏词-如果输入所有这些都会给我一个错误]

皱巴巴的海星, XX, xxx, 瑶瑶 黄色的阵雨, 呸呸呸, 动物癖, 艾米丽,

但是,如果我手动进入文本文件并准确地写出上面的“Emily”,它会给我我需要的错误消息。

【问题讨论】:

  • “我确实遇到了错误” 哪个错误?如果可能,请显示确切的错误消息,如果合适,请显示异常的完整堆栈跟踪。
  • 第一次停止播放后是否检查文件是否仍然存在?
  • 不,我说我没有收到错误 - 这就是问题所在。该名称附加到文件中,但是当我重新启动程序时(使用文件中的名称)尝试输入名称时没有出现错误。例如,我将第一次输入名称“Emily”。 Emily 追加到文件中。如果我重新启动程序并再次输入“Emily”,我不会收到 Emily 已在文件中的错误。
  • 重启后是否调用Char_Name函数?
  • 试试unacceptable_names2.write(name + '\n')

标签: python file append


【解决方案1】:

这一行unacceptable_names2.write(name) 将名称附加到同一行。 您应该在每个名称后加上,。只有这样

for line in unacceptable_names.readlines():
        for i in line.split(","):
            names_list.append(i.strip())`

工作。

unacceptable_names2.write(name)之后的当前文件内容:

helloonetwothree

你想要的:

hello,one,two,three

更新代码:

def Char_Name(self,name):
    string1=str(name).lower()
    unacceptable_names=open("C://Users//Documents//Unacceptable_Names.txt", "r")
    unacceptable_names2=open("C://Users//Documents//Unacceptable_Names.txt", "a")
    names_list= []
    for line in unacceptable_names.readlines():
        for i in line.split(","):
            names_list.append(i.strip())
    if name.isalpha()==False:
        print("You entered a name containing non-alphabetic characters, pease reenter a new name:")
        main()
    elif len(name)>=10:
        print("You entered a name containing 10 or more characters, pease reenter a new name:")
        main()
    elif string1 in names_list:
        print("You entered a name containing bad words or a name already in use! Try again.")
        main()
    else:
        unacceptable_names2.write(name+',')
        unacceptable_names2.close()
        self.character_name=name

更新:

在上面的代码中添加i.strip()。 您以某种方式在每个名称的开头添加了一个空格。 因此,当您搜索 yiffy 时,它无法找到匹配项。因为它被存储为yiffy

In [54]: 'wrinkled starfish, xx, xxx, yaoi, yellow showers, yiffy, zoophilia, Emily,'.split(','
   ....: )
Out[54]: 
['wrinkled starfish',
 ' xx',
 ' xxx',
 ' yaoi',
 ' yellow showers',
 ' yiffy',
 ' zoophilia',
 ' Emily',
 '']

【讨论】:

  • ',' 应该在 name 之前以将其与前一个分开
  • 不一定。 Split 只是在字符串中的任意位置查找字符。
  • 可能是我不对,但输出会是:hello,one,twothree,,在split 之后你会得到['hello', 'one', 'twothree', '']
  • 我明白你的意思了——但是将 unacceptable_names2.write(name) 更改为 unacceptable_names2.write(name +",") 仍然不能解决问题
  • @Megan 我的解决方案怎么样?
【解决方案2】:
def Char_Name(self,name):
    string1=str(name).lower()
    unacceptable_names=open("C://Users//Documents//Unacceptable_Names.txt", "r")
    unacceptable_names2=open("C://Users//Documents//Unacceptable_Names.txt", "a")
    names_list= []
    for line in unacceptable_names.readlines():
        for i in line.split(","):
            names_list.append(i)
    if name.isalpha()==False:
        print("You entered a name containing non-alphabetic characters, pease reenter a new name:")
        main()
    elif len(name)>=10:
        print("You entered a name containing 10 or more characters, pease reenter a new name:")
        main()
    elif string1 in names_list:
        print("You entered a name containing bad words or a name already in use! Try again.")
        main()
    else:
        unacceptable_names2.write(',' + str(name) ) # <------- 
        unacceptable_names2.close()
        self.character_name=name

或者您可以将最后一个 else 更改为:

else:
        unacceptable_names2.write('\n' + str(name) + '\n')
        unacceptable_names2.close()
        self.character_name=name

【讨论】:

    【解决方案3】:

    您还应该确保名称完全匹配。如果您只是在 python 中匹配,它可能会将一个名称混淆为另一个名称。示例,有两个用户名相似的用户示例: 1) 梅根 2) 梅根 2015。 在一个简单的匹配案例中:如果你搜索 Megan,python 可能会找到 Megan2015 并说它找到了,因为“Megan2015”中的“Megan”

    def exact_match(phrase, word):
    import re
    
    b = r'(\s|^|$)'
    res = re.match(b + word + b, phrase, flags=re.IGNORECASE)
    return bool(res)  # returns true or false
    
    def Char_Name(self,name):
    
    string1=str(name).lower()
    unacceptable_names=open("C://Users//Documents//Unacceptable_Names.txt", "r")
    unacceptable_names2=open("C://Users//Documents//Unacceptable_Names.txt","a")
    names_list= []
    
    for line in unacceptable_names.readlines():
    
        for i in line.split(","):
            names_list.append(i)
    
    if name.isalpha()==False:
        print("You entered a name containing non-alphabetic characters, please  reenter a new name:")
        main()
    
    elif len(name)>=10:
        print("You entered a name containing 10 or more characters, pease reenter a new name:")
        main()
    
    elif:
        for n in range(0,len(names_list)):
    
            if exact_match(string1, names_list[n]) == True:
                print("You entered a name containing bad words or a name already in use! Try again.")
                main()
    else:
        unacceptable_names2.write(str(name + " , ") )
        unacceptable_names2.close()
        self.character_name=name
    

    【讨论】:

      【解决方案4】:

      您应该将每个名称写在单独的行上,您根本不需要 aplit,在打开文件时创建一组名称并使用 a+ 打开一次以进行读取和附加:

      def Char_Name(self,name):
          string1 = name.lower()
          with open("C://Users//Documents//Unacceptable_Names.txt", "a+") as f:
              unacceptable_names = set(line.rstrip() for line in f)
          if not name.isalpha():
              print("You entered a name containing non-alphabetic characters, please re-enter a new name:")
              main()
          elif len(name) >= 10:
              print("You entered a name containing 10 or more characters, please re-enter a new name:")
              main()
          elif string1 in unacceptable_names:
              print("You entered a name containing bad words or a name already in use! Try again.")
              main()
          f.write("{}\n".format(name))
          self.character_name = name
      

      使用pickle 存储一组名称可能是一个更好的主意。

      我还会使用 while 循环在循环中询问用户他们的姓名,而不是重复调用 main。

      def Char_Name(self):
          with open("C://Users//Documents//Unacceptable_Names.txt", "a+") as f:
              unacceptable_names = set(line.rstrip() for line in f)
          while True:
              name = input("Please enter your username")
              _name = name.lower()
              if _name in unacceptable_names:
                  print("You entered a name containing bad words or a name already in use! Try again.")
              elif _name.isalpha():
                  print("You entered a name containing non-alphabetic characters, please re-enter a new name:")
              elif len(name) >= 10:
                  print("You entered a name containing 10 or more characters, please re-enter a new name:")
              else:
                  break
          f.write("{}\n".format(name))
          self.character_name = name
      

      除非您真的想要一个列表,否则无需使用 readlines,如果您要构建一个名称容器,那么集合是检查成员资格的最有效方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        • 2012-10-17
        • 2019-08-04
        • 1970-01-01
        相关资源
        最近更新 更多