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

时间:2015-01-04 01:58:11

标签: python python-3.x

我看到这个问题已经被多次问到这个网站,但我找不到能够满足我需要的答案。

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

libertarians
liberticidal
liberticide
liberticide's
liberticides

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

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

简而言之,列表可以打印,但很少。

2 个答案:

答案 0 :(得分:4)

最简单的方法:

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

680k行意味着几兆字节 - 来自MemoryError,在某些评论中表达了恐怖! - ),在任何现代平台上,您的可用虚拟内存 giga 字节(如果您在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

所以,超过200MB的话超过2MB - 检查!因此,对于超过600k字,我推断"有点超过6MB" - 大大低于在这个"勇敢的新世界中可能导致MemoryError的数量" (来自像我这样的老玩家的POV :-)几千兆字节的机器(甚至手机,现在......: - 。)。

另外,无论如何,如果要将这些单词列表保存为单词列表,那么您就不会花费任何少于这些几兆字节的内存量!逐行阅读文件并巧妙地操作,只需要从您需要的行子集中保留所需的数据子集,咳咳,"完全错位的工作",当您的目标基本上是为了保持所有来自每一行的文本 - 在这种特殊情况下(碰巧满足这个Q的要求! - ),只需使用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上......:

$ 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%。

答案 1 :(得分: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