2015-05-09 57 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方法,除非你真正想要的清單,如果你要建立名稱的容器,然後一組是檢查成員的最有效的方式。