将文本列表(字符串)转换为 python 列表

converting a text list (string)to a python list

我看到这个问题在这个网站上被问了很多次,但我找不到满足我需要的答案。

我需要做的是将一个很长的文本文件(680k 行)转换为 python 中的列表。整个文本文件的格式如下所示:

libertarians
liberticidal
liberticide
liberticide's
liberticides

我的最终目标是创建一个系统,我可以用相应的字典值替换单词。例如dic['apple', 'pears', 'peaches', 'cats']。下面的代码不起作用,因为它生成的列表不能用在 if word in list: 语句中。我尝试过这个。

with open('thefile.txt') as f:
  thelist = f.readlines()

这是检索列表方法的全部代码。

with open('H:/Dropbox/programming/text compression/list.txt') as f:
 thelist = f.readlines()
word = input()
if word in thelist:
 print("hu")
else:
 print("l")

输出与输入'apple': 1

简而言之,可以打印列表,但除此之外别无其他。

这样试试:

with open('file') as f:
    my_list = [x.strip() for x in f]

您还可以即时完成工作,而不是存储所有行:

with open('file') as f:
    for x in f:
        # do your stuff here on x

最简单的方法:

with open('thefile.txt') as f:
    thelist = f.readlines()

680k 行意味着几兆字节 -- far MemoryError,一些评论中表达了恐怖!-),在任何现代平台上,只要您可用虚拟内存是 gigabytes(如果你在 Commodore 64 上是 运行 Python,那是不同的,但是,我相信你还有很多其他的问题:-).

readlines 方法在内部执行其他方法需要显式执行的换行剥离,因此更可取(也更快)。而且,如果您需要将结果作为单词列表,那么无论如何您都无法通过零碎的方法来节省任何内存。

添加:例如,在我的 Macbook Air 上,

$ wc /usr/share/dict/words
235886  235886 2493109 /usr/share/dict/words

所以超过 OP 提到的那个的 1/3。这里,

>>> with open('/usr/share/dict/words') as f: wds=f.readlines()
... 
>>> sys.getsizeof(wds)
2115960

所以,超过 2MB 的字数超过 200k 个 -- 检查!因此,对于超过 600k 的单词,我推断 "a bit over 6MB" - 大大低于 "brave new world" 中可能导致 MemoryError 的数量(来自像我这样的老前辈的 POV:-) 具有许多千兆字节的机器(甚至 phones,如今......:-).

此外,无论如何,如果要将该单词列表保存为单词列表,那么您将不会花费比这几兆字节少的内存!逐行读取文件并巧妙地操作以仅保留您需要的行子集中所需的数据子集,咳咳,"totally misplaced effort",而您的目标本质上是保留每个行的几乎所有文本单行——在那种特殊情况下(恰好满足这个问题的要求!-),只需使用 readlines 就可以了!-)

补充:对 Q 的编辑清楚地表明(尽管问题中没有任何地方说明!)这些行必须在单词的右侧包含一些空格,因此需要 rstrip。即便如此,公认的答案也不是最优的。考虑以下文件 i.py:

def slow():
    list_of_words = []
    for line in open('/usr/share/dict/words'):
        line = line.rstrip()
        list_of_words.append(line)
    return list_of_words

def fast():
    with open('/usr/share/dict/words') as f:
        wds = [s.rstrip() for s in f] 
    return wds

assert slow() == fast()

最后的 assert 只是验证了这两种方法产生相同结果的事实。现在,在 Macbook Air 上...:[=​​22=]

$ python -mtimeit -s'import i' 'i.slow()'
10 loops, best of 3: 69.6 msec per loop
$ python -mtimeit -s'import i' 'i.fast()'
10 loops, best of 3: 50.2 msec per loop

我们可以看到,接受的答案中的循环方法比列表理解多花费了近 40% 的时间。