繁体   English   中英

文本列表(字符串)转换为一个Python列表

[英]converting a text list (string)to a python list

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

我需要做的是将一个很长的文本文件(68万行)转换为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

简而言之,可以打印该列表,但仅打印其他内容。

最简单的方法:

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

在任何可用虚拟内存为千兆字节的现代平台上,680k行意味着几兆字节- 远离 MemoryError (在某些注释中表示的恐怖!-),这是不同的(如果您在Commodore 64上运行Python,则有所不同) ,但是我确定您还有很多其他问题:-)。

readlines方法在内部执行换行,而其他方法需要显式执行,因此是更可取的(且更快)。 而且,如果您需要将结果作为单词列表使用,则根本无法通过零碎的方式节省任何内存。

新增:例如,在我的Macbook Air上,

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

因此,OP所提及的数字的三分之一以上。 这里,

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

因此,超过20万字的空间超过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%。

尝试这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM