【问题标题】:Comparing strings in python 2.7比较python 2.7中的字符串
【发布时间】:2016-02-12 11:50:41
【问题描述】:

这是我的代码:

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'

所以我不知道问题出在哪里。提前致谢。

【问题讨论】:

  • 您还应该解释这些 txt 文件包含什么内容以及您的目标是什么。
  • 嗯,它是一个包含我的 Db 中所有已解析标题的文件。如果我添加一个新标题,我希望 Python 比较文件 txt 以检查是否存在。然后做
  • 我建议您在 .txt 文件中以不同的方式组织标题,而不是用逗号分隔标题:每行 1 个标题。这将使事情变得容易得多,因为您可以执行以下步骤。 1)使用fopen()打开文件; 2)使用readlines()创建一个python列表,其中1个元素是1个标题,所以你不需要split()命令; 3) 使用 for 循环遍历此类列表,以检查给定标题是否存在。
  • Tks 虚拟机。真的帮助了这个答案。我现在正在努力。

标签: string python-2.7


【解决方案1】:

@Rafa,为了让您更好地理解我在 cmets 中的意思,我必须写一个完整的答案才能附上代码和屏幕截图。
假设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']

为了使您的代码更加健壮,我两次添加了回到未来。基本上,您可以通过set() 函数消除newFilms 中的重复项。这会将 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 循环中),您可能希望将换行值替换为逗号。

这种方法更干净,我认为也可以解决您一直遇到的问题,并避免循环中连续打开/关闭文件。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2022-01-10
    • 2012-06-14
    • 2015-09-29
    相关资源
    最近更新 更多