python等价于GNU';cat&x27;这显示了独特的线条

python等价于GNU';cat&x27;这显示了独特的线条,python,Python,有没有人用python编写GNU命令并愿意与大家分享?GNUCat实际上做了很多&我今天真的不想重新发明轮子。是的,我做了谷歌搜索&读完后我决定试试 编辑:我想修改它,使它只显示唯一的行。这取决于您想要的功能。如果你只想打印一个文件,你可以这样做 with open('myfile') as f: for line in f: print line, 或者连接一些文件,您可以这样做 filenames = ['file1', 'file2', 'file3'] for

有没有人用python编写GNU命令并愿意与大家分享?GNUCat实际上做了很多&我今天真的不想重新发明轮子。是的,我做了谷歌搜索&读完后我决定试试


编辑:我想修改它,使它只显示唯一的行。

这取决于您想要的功能。如果你只想打印一个文件,你可以这样做

with open('myfile') as f:
    for line in f:
        print line,
或者连接一些文件,您可以这样做

filenames = ['file1', 'file2', 'file3']
for filename in filenames:
    with open(filename) as f:
        for line in f:
            print line,
没有一般性的答案。根据要复制的功能,代码将有所不同。要准确地复制一些奇怪和特殊的内容,请使用
子流程
模块并调用cat

如果您想实现与cat相同的接口,这似乎是一个奇怪的要求。您可以调用cat,这样可以更自然地编写代码。我认为完全重新实施cat的唯一原因是为了家庭作业,如果这是你的原因,我希望你不要要求成品。

最新: 感谢Ned提供的文件输入提示!以下是最新消息:

#!/usr/bin/python

"""cat the file, but only the unique lines
"""
import fileinput

if __name__ == "__main__":
    lines=set()
    for line in fileinput.input():
        if not line in lines:
            print line,
            lines.add(line)
此前(2010-02-09):

这就是我的结局。它能满足我的迫切需要。谢谢迈克·格雷厄姆的帮助

#!/usr/bin/python
"""cat the file, but only the unique lines
"""
import optparse
import sys

if __name__ == "__main__":
    parser = optparse.OptionParser()
    parser.set_usage('%prog [OPTIONS]')
    parser.set_description('cat a file, only unique lines')

    (options,args) = parser.parse_args()

    lines = set()
    for file in args:
        if file == "-":
            f = sys.stdin
        else:
            f = open(file)
        for line in f:
            if not line in lines:
                print line,
                lines.add(line)

对不起,我没说清楚。我想知道是否有人写了一些东西来完全复制GNUCAT。不,不是为了家庭作业——我想把它作为其他命令的基础。谢谢你的回答,我把它作为catuniq的基础。源代码见我的答案。因为
行中的行
对于列表是O(n),所以这里有O(n^2)运行时。您可以通过将行设置为一个集合来修复此问题,该集合具有O(1)成员资格测试:
lines=set()
。修复了,谢谢拜耳!我在一个30k行的文件上尝试了这个方法,运行时间从15秒到标准库中的fileinput模块。您可以用一行代码替换大部分代码。谢谢,Ned——fileinput将行数从17行减少到了7行!所以,你不想要
cat
,你想要
uniq
(就功能而言)。@TZ——似乎是这样——15年以上的Unix编程&我忘了“uniq”。@TZ——迈克的答案仍然有效。uniq只处理彼此相邻的行,而不处理由其他唯一行分隔的行。