2015-05-09 56 views
1

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

为了确保程序的每个用户不使用相同的名称,当玩家输入名称时,我将它追加到Unacceptable_Names,然后当下一个玩家玩它时,如果它发生错误if他们在这个文件中输入一个名字。

下面的代码适用于已经在文件中创建的单词,但是当我重放并输入相同的名称时,我不会收到错误。有人可以帮助排除名称未被检查的原因吗?

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外观:如果输入给我一个错误席前与文件中的其他一些不好的话沿着所有这些]

皱海星, XX,XXX , YAOI, 黄色阵雨, yiffy, 动物恋, 艾米丽,

但是,如果我手动去到文本文件,并写入 “埃米莉” E xactly如何是上面的,它会给我我需要的错误信息。

+2

*“我确实收到错误”*哪个错误?如果可能的话,请显示确切的错误信息,如果适当,则显示异常的完整堆栈跟踪。 – dhke

+0

您是否在第一次停止播放后检查文件是否仍然存在? – tema

+0

不,我说我没有得到一个错误 - 这是问题。该名称附加到文件中,但是当我重新启动程序(使用文件中的名称)时,尝试输入名称时没有出现错误。例如,我会第一次输入名字“Emily”。 Emily追加到文件中。如果我重新启动程序并再次输入“Emily”,我不会收到Emily已经在文件中的错误。 – Megan

回答

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', 
''] 
+0

'','' '应该在​​'name'之前将其与前一个分开 – tema

+0

不一定。 “Split”只是在字符串中的任何位置查找字符。 – fixxxer

+0

可能是我不是对的,但输出将会是:'hello,one,twothree,'并且'split'后你会得到'['hello','one','twothree','']' – tema

0
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 
0

你也应该确保精确匹配的名字。如果你只是在Python中匹配,它可能会混淆一个名称为其他名称。例如,有两个用户具有相似的用户名示例: 1)Megan 2)Megan2015。 在一个简单的匹配情况:如果搜索梅根,蟒蛇可能会发现Megan2015,并说已经找到了,因为“梅根”中的“Megan2015”

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 
0

你应该写在单独的行每个名字,你赢了“T需要在所有aplit,让一组的名字,当你打开文件,并用+来阅读打开一次,追加:

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方法,除非你真正想要的清单,如果你要建立名称的容器,然后一组是检查成员的最有效的方式。