python 不使用 readlines() 逐行迭代



我有一个文本文件,每行只有字符串。我想让 python 查看一行,然后检查该字符串是否在列表中,如果没有添加它,否则跳到下一行。稍后,我将使用集合来计算每个列表项的总出现次数。

testset = ['2']
# '2' is just a "sanity check" value that lets me know I am extending list
file = open('icecream.txt')
filelines = file.readlines()
for i in filelines:
    if i not in testset:
    testset.extend(i)
else:
    print(i, "is already in set")
print(testset)

我期待得到:

testset = ['2', 'chocolate', 'vanilla', 'AmericaConeDream', 'cherrygarcia', ...]

相反,我得到了:

testset = ['2', 'c', 'h', 'o', 'c', 'o' ....]        

不知道这里发生了什么。我尝试使用以下方法运行它: 对于文件中的 i:

我相信我在另一篇文章中读到open()本身就是一个迭代器。有人可以启发我如何让这个迭代工作吗?

extend()遍历其参数的元素(在本例中为字符),并将每个元素分别添加到列表中。请改用append()

    testset.append(i)

如果您不关心线条在testset中出现的顺序,则可以使用集合而不是列表。以下单行将创建一个包含文件中每个唯一行的集合:

testset = set(open('icecream.txt'))

编辑:看看NPE的答案:它基本上是一样的,但更优雅和pythonic。

尝试一次性读取、拆分和减少:

textset = set(file.read().split('n'))
您可以将

extend视为值的迭代对象而不仅仅是一个值的append。因为您计划使用计数器来对抗文件,所以我会执行以下操作来键关键唯一值:

with open('text.txt') as text:
    data = Counter(i for i in text) # try data.keys()

最新更新