Textfile1包含单词,其中一些是重复的:
列车
21street
列车
等等。
我需要计算它们的出现次数并将其写入Textfile2,同时删除重复项。另外,按字母顺序排列,这就是为什么我有sorted
的原因。最终Textfile2的外观示例:
训练2
21street 1
......等等。
这是我的尝试:
file1=open(textfile1,"r")
list1=[]
for line in file1:
list1.append(line)
import collections
counter=collections.Counter(list1) #not sure how I can use this in my program
list2=list(set(list1))
list3=sorted(list2)
file2=open(textfile2,"w")
for i in list3:
file2.write(i+count((i)in list1))
单词计数似乎不起作用,我不知道如何解决它。谢谢你的帮助。
答案 0 :(得分:3)
让我们从错误开始逐步进行一些更改。
file2.write(i+count((i)in list1))
# ^^^^^^^^^^^^^^^^^^
# NameError: name 'count' is not defined
问题是您是否错误地访问了计数。 Counter
的作用类似于dict
;关键是要计算的是什么,值是计数(int
)。您为Counter
提供了名称counter
,因此要访问行i
的计数,请将其更改为此,由于其他原因会出错:
file2.write(i+counter[i])
# ^^^^^^^^^^
# TypeError: must be str, not int
即使我们成功获得了计数,我们也无法将其添加到行i
,就像这样。线和计数是两种不同的类型;一个是文本(str
),另一个是数字(int
)。我们需要将该数字转换为其文本表示。如果这让您感到困惑,请将其视为:2 + 2 == 4
而"2" + "2" == "22"
。以下是如何做到这一点:
file2.write(i+str(counter[i]))
不再有错误,但根据您的测试方式,以file2
打开的文件可能仍为空。只有在完成后关闭更改,才会将更改写入磁盘。永远不要忘记这样做,您可以使用with
语句将簿记留给Python。在缩进块的末尾,文件将自动关闭。下面是完整的代码,其中包含一些注释更改:
# imports at the top
import collections
list1=[]
with open(textfile1,"r") as file1:
for line in file1:
list1.append(line)
# file1 automatically closed here
counter=collections.Counter(list1)
list2=list(set(list1))
list3=sorted(list2)
with open(textfile2,"w") as file2:
# i implies index which it isn't; let's call it line too
for line in list3:
file2.write(line+str(counter[line]))
# file2 automatically closed here
运行后,以file2
打开的文件将如下所示:
21street
1Train
2
该号码最后在下一行。发生这种情况的原因是,您存储在列表中的行不仅仅是"21street"
和"Train"
,而是"21street\n"
和"Train\n"
。最后的"\n"
是换行符,用作行分隔符。如果您在此之后添加任何文本,它将以新行结束 - 这就是重点。在list
中,不再需要此类分隔符,因此请将其删除:
list1.append(line.rstrip("\n"))
# ^^^^^^^^^^^^^
现在您的输出将是这样的:
21street1Train2
在再次写入文件时,需要在正确的位置添加分隔符。什么是正确的地方?在一条线的尽头。此外,行和计数之间的空格会很好:
file2.write(line+" "+str(counter[line])+"\n")
# ^^^^ ^^^^^
最后,输出符合要求:
21street 1
Train 2
答案 1 :(得分:0)
我的解决方案是:
with open('a.txt') as f:
a = f.read()
a = a.split('\n')
a = [i for i in a if i != '']
from collections import Counter
b = Counter(a)
with open('b.txt', 'w') as f:
for key in b:
f.write('{} : {}\n'.format(key, b[key]))
答案 2 :(得分:0)
您应该尝试list
而不是dict
而不需要导入任何外部模块,只需通过某种逻辑即可:
track={}
with open("file.txt",'r') as f:
for line in f:
if line!='\n':
if line.strip() not in track:
track[line.strip()]=1
else:
track[line.strip()]+=1
with open("new_text",'w') as new:
for key,value in track.items():
tr="{} {} \n".format(key,value)
new.write(tr)
在new_text文件中输出:
Train 2
21street 1