重复的数字在Python中读取文本文件

我有一个 Python 脚本,我试图用它来打印Duplicate.txt文件中的重复数字:


newList = set()


datafile = open ("Duplicate.txt", "r")


for i in datafile:

    if datafile.count(i) >= 2:

        newList.add(i)

datafile.close()


print(list(newList))

我收到以下错误消息,有人可以帮忙吗?


AttributeError: '_io.TextIOWrapper' object has no attribute 'count'


慕尼黑的夜晚无繁华
浏览 203回答 3
3回答

萧十郎

问题恰恰是它所说的:文件对象不知道如何计数。它们只是迭代器,而不是列表或字符串之类的东西。造成这种情况的部分原因是,一遍又一遍地扫描整个文件可能会非常缓慢。如果你真的需要使用count,你可以先把这些行放到一个列表中。列表是完全在内存中的,因此一遍又一遍地扫描列表并没有那么慢,并且列表有一种count方法可以完全满足您的要求:datafile = open ("Duplicate.txt", "r")lines = list(datafile)for i in lines:    if lines.count(i) >= 2:        newList.add(i)datafile.close()但是,有一个更好的解决方案:只需在进行时保持计数,然后保留 >= 2 的计数。实际上,您可以将其写成两行:counts = collections.Counter(datafile)newList = {line for line, count in counts.items() if count >= 2}但是,如果您不清楚为什么这样做,您可能希望更明确地进行操作:counts = collections.Counter()for i in datafile:    counts[i] += 1newList = set()for line, count in counts.items():    if count >= 2:        newList.add(line)或者,如果您甚至不了解以下内容的基础知识Counter:counts = {}for i in datafile:    if i not in counts:        counts[i] = 1    else:        counts[i] += 1

汪汪一只猫

您代码中的错误正在尝试应用count到文件句柄,而不是list。无论如何,您不需要计数元素,只需要查看文件中是否已经存在该元素。我建议使用一个标记集,以记下已经发生了哪些元素。seen = set()result = set()with open ("Duplicate.txt", "r") as datafile:    for i in datafile:        # you may turn i to a number here with: i = int(i)        if i in seen:            result.add(i)  # data is already in seen: duplicate        else:            seen.add(i)  # next time it occurs, we'll detect itprint(list(result))  # convert to list (maybe not needed, set is ok to print)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python