2016-02-12 95 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循环中),您可能想用逗号替换换行值。

这种方法更清洁,我认为它还可以解决您一直存在的问题,并避免在循环中连续打开/关闭文件。希望这可以帮助!