我有一个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'
答案 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)