Python:将文件中的单词加载到集合中

37

我有一个简单的文本文件,其中包含几千个单词,每个单词都独占一行,例如:

aardvark
hello
piper

我使用以下代码将单词加载到一个集合中(我需要测试成员资格的单词列表,所以选择了集合作为数据结构):

my_set = set(open('filename.txt'))

以上代码会生成一个包含以下条目的集合(每个单词后都跟着一个空格和换行符):

("aardvark \n", "hello \n", "piper \n")

如何最简单地将文件加载到集合中并去除空格和 \n?

谢谢

6个回答

78
字符串的strip()方法可以去除两端的空格。
set(line.strip() for line in open('filename.txt'))

5
如果你有一个大文件,这种方法比集合解决方案更好,因为 map 函数会将整个文件加载到内存中作为行列表,然后被丢弃(不过使用 itertools.imap 可以解决这个问题)。 - Ryan Ginstrom
1
@Ryan:对于 Python <= 2.6 是正确的,但在 3.0 中 map 返回一个生成器。 - Stephan202
@RyanGinstrom 很抱歉回复晚了,但我还是忍不住要问你这个问题!我注意到 print my_set[0] 仍然会打印出 aardvark。它是在打印后将光标移动到下一行吗?如果我错了,请纠正我,这是怎么发生的?(Python 27)谢谢! - Utsav T
@Noob 是的,print 会添加一个换行符。尝试使用 print repr(my_set[0]) - Ryan Ginstrom
6
它是否也关闭了文件处理器? - oak

16

只需加载所有文件数据并将其拆分,它会处理每行一个单词或由空格分隔的多个单词,同时一次性加载整个文件会更快,除非您的文件大小为GB级别。

words =  set(open('filename.txt').read().split())

如果每行只有一个单词,那么这会起作用,如果每行有多个单词,也会起作用吗?(假设如果我有一行像“你好再见”这样的话,我希望“你好”和“再见”是集合中的两个不同单词) - Roee Adler
是的,它基本上会根据空格、换行符、制表符等进行分割,因此您可以将所有单词放在一行中,也可以放在多行中或混合使用。 - Anurag Uniyal
不必担心将整个文件加载到内存中,除非您有非常非常大的文件,我怀疑这种情况。几MB的大小是完美的,这将是最快的。 - Anurag Uniyal

4
my_set = set(map(str.strip, open('filename.txt')))

这个解决方案将通过对filename.txt的每一行应用str.strip方法来正确地删除任何空格和换行符。 - Wesley

2

仅删除右侧空格。

set(map(str.rstrip, open('filename.txt')))

如果文件大小相当大,则该方法可能更快。它避免了每个字符串左侧与isspace()的额外比较。 - John T
是的,作者只指定了右侧的空格,所以使用 rstrip 而不是 strip 或 split 是有道理的。 - Unknown

1
with open("filename.txt") as f:
    mySet = map(str.rstrip, f)

如果您想在Python 2.5中使用它,您需要:
from __future__ import with_statement

我认为这里有语法错误: set(map(str.rstrip('\n') str, f) - mtasic85

1
with open("filename.txt") as f:
    s = set([line.rstrip('\n') for line in f])

2
你不需要使用列表推导式。 - SilentGhost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接