2016-02-12 97 views
0

比較字符串這是我的代碼:在Python 2.7

for films in filmlist: 
    with codecs.open('peliculas.txt', encoding='utf8', mode='r') as lfile: 
     filmsDone = lfile.read() 
     filmsDoneList = filmsDone.split(',') 

    if films not in filmsDoneList: 
     with codecs.open('peliculas.txt', encoding='utf8', mode='a+') as lfile: 
      lfile.write(films.strip() + ',') 

它永遠不會承認列表的最後一個項目。 我已經打印了filmsDoneList,PyCharm中的最後一個項目如下所示:u'X Men.Primera Generacion'。我已經印製電影,他們看起來像這樣:X Men.Primera Generacion'

所以我不知道問題出在哪裏。提前致謝。

+0

你還應該解釋這些txt文件包含什麼以及你的目標是什麼。 – Alessiox

+0

那麼,它是一個文件,其中包含來自我的Db的所有解析標題。如果我添加一個新標題,我希望Python比較文件txt以檢查是否存在。然後做 – Rafa

+0

而不是用逗號分隔您的標題,我建議您在.txt文件中以不同的方式組織您的標題:每行1個標題。這會讓事情變得更容易,因爲您可以執行以下步驟。 1)使用'fopen()'打開文件; 2)使用'readlines()'創建一個python列表,其中1個元素是1個標題,所以你不需要'split()'命令; 3)用for循環迭代這樣的列表以檢查給定標題是否存在。 – Alessiox

回答

0

@Rafa,爲了您更好地理解我在評論中的含義,我必須編寫完整的答案才能附上代碼和屏幕截圖。
比方說,peliculas.txt文件的格式如下:
enter image description here

您可以根據以下3個命令導入在Python這樣的文件:

fileIN=open('peliculas.txt','r') 
filmsDoneList=fileIN.readlines() 
fileIN.close() 

所以你基本上打開文件,每一行由於進口至readlines(),然後關閉該文件,因爲其內容在filmsDoneList中可用。後者有以下內容(PyCharm):

enter image description here

顯然這個名單很長,不適合我的屏幕,但你明白了吧。
你現在可通過以下回路來擺脫惱人的換行符標籤'\r\n'的:

for id in range(len(filmsDoneList)): 
    filmsDoneList[id]=filmsDoneList[id].strip() 

現在filmsDoneList的形式爲: enter image description here 現在好多了,是嗎?

現在,讓我們說你要添加以下影片:

newFilms=['The Exorcist','Back to the Future','Aliens','Back to the Future'] 

爲了使您的代碼更健壯,我已經添加回到未來的兩倍。基本上你可以通過set()函數來清除newFilms中的重複項。這將轉換newFilms在去除重複一個set,但我們將它歸功於轉換回列表這個命令:

newFilms=list(set(newFilms)) 

現在newFilms的形式爲:

enter image description here

現在,一切都已排序,是時候檢查newFilms中的項目是否已在filmsDoneList之中,回想一下是peliculas.txt的內容。

重新打開peliculas.txt如下:

fileOUT=open('peliculas.txt','a') 

'a'標籤意味着「追加」,所以基本上你寫的一切都將被添加到該文件,但不從任何東西。
和主迴路雲:

for film in newFilms: 
    if film in filmsDoneList: 
     pass 
    else: 
     fileOUT.write(film+'\n') 

pass的意思是 「什麼都不做」。 write命令還將換行標籤附加到影片標題:這將保持每行1格的前一格式。在這個循環結束時,你可能會關閉fileOUT
產生的peliculas.txt
enter image description here

,正如你所看到的,回到未來在newFilms但不追加到該文件的末尾,因爲已經是它。相反,驅魔者和外星人已經被追加到這個文件的底部。

如果您的文件標題以逗號分隔,則此方法仍然有效。然而,你必須在第一個for循環之後添加

filmsDoneList=filmsDoneList[0].split(',') 

。同樣在write函數中(在上一個for循環中),您可能想用逗號替換換行值。

這種方法更清潔,我認爲它還可以解決您一直存在的問題,並避免在循環中連續打開/關閉文件。希望這可以幫助!