7

我总是使用这个命令行来排序和只获取 uniq 行,即使是大文件(超过 500,000 行),它也可以作为一种魅力

sort filename.txt | uniq | sponge filename.txt

最短的等效 python 代码将是

f = open("filename.txt", "r")
lines = [line for line in f]
lines = lines.sort()
lines = set(lines)

但当然,由于内存限制,这是不可扩展的,并且在 python 中编写可扩展代码需要时间,所以我想知道 python 中最短的等效代码(包)是什么

4

4 回答 4

6

您不需要在 python 中进行排序,因为set即使没有排序也会处理唯一性。

f = open("filename.txt", "r")
lines = set(f.readlines())

shellsort命令还将这些行加载到内存中,因此使用它不会为您节省任何内存。如果你有非常大的文件或者你坚持不使用额外的内存,你可以尝试一些疯狂的技巧,比如这里显示的技巧:http: //neopythonic.blogspot.in/2008/10/sorting-million-32-bit-整数-in-2mb.html

于 2013-11-04T09:24:41.103 回答
3

有一个迭代器可以执行 sort 的操作,即 sorted。让我们通过只产生不等于前一行的行来制作一个模仿 uniq 的行:

def uniq(iterator):
    previous = float("NaN")  # Not equal to anything
    for value in iterator:
        if previous != value:
            yield value
            previous = value

现在你可以做同样的事情,使用:

with open('/path/to/filename') as f:
    for line in uniq(sorted(f)):
        print(line)

BUt sorted(和shell的排序)无论如何都必须存储所有内容(如果文件中的最后一行应该首先输出怎么办),所以它比只使用set(f)而不是uniq(sorted(f))更糟糕。

于 2013-11-04T09:56:46.247 回答
2

使用来自 python 的 shell 命令:

import os
os.system("sort filename.txt | uniq | sponge filename.txt")
于 2014-03-25T07:15:25.620 回答
1

这是一个较短的示例:

with open("filename.txt", 'r') as f:
    lines = set(f)

另外,应该注意的一件事是,在这种情况下,一次只能将一行加载到内存中。原因是上面的代码等价于:

lines = set()
f = open("filename.txt", 'r')
for line in f: # now f works as a generator of lines, reading only one line at a time
     lines.add(line)
于 2013-11-04T09:33:12.050 回答