Textfile1 包含单词,其中一些是重复的:
Train
21street
Train
还有更多。
我需要计算它们出现的次数并将其写入 Textfile2,同时删除重复项。此外,按字母顺序排列,这就是为什么我在那里有 sorted
的原因。最终 Textfile2 应该是什么样子的示例:
Train 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))
字数统计好像不行,不知道怎么解决。感谢您的帮助。
最佳答案
让我们逐步进行一些更改,从您的错误开始。
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。在缩进 block 的末尾,文件自动关闭。下面是完整的代码,还有一些注释更改:
# 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
关于Python 字数统计不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47784843/