这是我的代码:
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 :(得分:0)
@Rafa,为了让您更好地理解我在评论中的意思,我必须写一个完整的答案,以便我附上代码和截图。
我们假设peliculas.txt
文件格式如下:
您可以根据以下3个命令在python中导入此类文件:
fileIN=open('peliculas.txt','r')
filmsDoneList=fileIN.readlines()
fileIN.close()
因此,您基本上打开文件,感谢readlines()
导入每一行,然后关闭该文件,因为其内容在filmsDoneList
中可用。后者具有以下内容(在PyCharm中):
显然这个列表很长,不适合我的屏幕,但你明白了
您现在可以通过以下循环删除那个烦人的换行标记'\r\n'
:
for id in range(len(filmsDoneList)):
filmsDoneList[id]=filmsDoneList[id].strip()
现在filmsDoneList
的格式为:
现在好多了,不是吗?
现在,我们假设您要添加以下电影:
newFilms=['The Exorcist','Back to the Future','Aliens','Back to the Future']
为了使您的代码更加健壮,我已经两次添加了Back to the Future。基本上你可以通过newFilms
函数去除set()
中的重复项。这会在newFilms
中转换set
并删除重复项,但我们会将其转换回列表,这要归功于此命令:
newFilms=list(set(newFilms))
现在newFilms
的格式为:
现在已经对所有内容进行了排序,现在是时候检查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
为
并且,如您所见,“回到未来”位于newFilms
但未附加到此文件的末尾,因为已经在其中。相反,驱魔人和外星人已被附加到此文件的底部。
如果您的文件标题以逗号分隔,则此方法仍然有效。但是你必须添加
filmsDoneList=filmsDoneList[0].split(',')
在第一个for循环之后。同样在write
函数中(在最后一个for循环中),您可能希望用逗号替换换行值。
这种方法更简洁,我认为还可以解决您已经遇到的问题并避免循环中连续打开/关闭文件。希望这有帮助!