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

时间:2018-08-22 20:36:18

标签: 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'

4 个答案:

答案 0 :(得分:4)

问题恰恰是它所说的:文件对象不知道如何计数。它们只是迭代器,而不是列表或字符串或类似的东西。

部分原因是,一遍又一遍地扫描整个文件可能会非常慢。

如果您确实需要使用axios.get(https://myapp.domain.com/api/),则可以先将行放入列表中。列表完全在内存中,因此一遍又一遍地扫描列表并没有那么慢,并且它们有一个axios.get(http://web:9000/api)方法可以完全执行您要使用的方法:

count

但是,有一个更好的解决方案:继续进行计数,然后保留> =2。实际上,您可以将其写为两行:

count

但是,如果您不清楚它为什么起作用,您可能需要更明确地做到这一点:

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

for i in lines:
    if lines.count(i) >= 2:
        newList.add(i)

datafile.close()

或者,如果您甚至不了解counts = collections.Counter(datafile) newList = {line for line, count in counts.items() if count >= 2} 的基本知识:

counts = collections.Counter()
for i in datafile:
    counts[i] += 1
newList = set()
for line, count in counts.items():
    if count >= 2:
        newList.add(line)

答案 1 :(得分: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 it

print(list(result))  # convert to list (maybe not needed, set is ok to print)

答案 2 :(得分:0)

您的直接错误是因为您询问if datafile.count(i),而datafile是一个文件,它不知道如何计算其内容。

您的问题不是关于如何解决更大的问题,而是因为我在这里: 假设Duplicate.txt包含数字,每行一个,那么我可能会将每行的内容读入列表,然后使用Counter来计数列表的内容。

答案 3 :(得分:0)

您正在寻找使用list.count()方法,而是错误地在文件对象上调用了它。相反,让我们读取文件,将其内容拆分为一个列表,然后使用list.count()方法获取每个项目的计数。

# read the data from the file
with open ("Duplicate.txt", "r") as datafile:
    datafile_data = datafile.read()

# split the file contents by whitespace and convert to list
datafile_data = datafile_data.split()

# build a dictionary mapping words to their counts
word_to_count = {}
unique_data = set(datafile_data)
for data in unique_data:
    word_to_count[data] = datafile_data.count(data)

# populate our list of duplicates
all_duplicates = []
for x in word_to_count:
    if word_to_count[x] > 2:
        all_duplicates.append(x)