1

我想通过调用“排序”命令通过 Python 脚本对制表符分隔的文件进行排序。如果我使用这个:

subprocess.Popen(["sort", r"-t$'t'", "-k1,2", "input", "-o", "output"]).wait()

我收到此错误:

sort: multi-character tab `$\'t\''

如果我使用shell=True

subprocess.Popen(["sort", r"-t$'t'", "-k1,2", "input", "-o", "output"], shell=True).wait()

该过程只是挂起。

我更喜欢使用第一种方法,没有shell=True. 有什么建议么?

编辑:文件很大。

4

2 回答 2

2

Python 可以用制表符创建字符串;$'\t'仅当您直接在 shell 中工作时才需要。

subprocess.Popen(["sort", "-t\t", "-k1,2", "input", "-o", "output"]).wait()
于 2013-06-06T19:58:39.803 回答
0

subprocess.call(r"sort -t\t -k1,2 input -o output")

看起来更干净 -call是子进程模块上比“Popen”更高级别的函数 - 并且会使您的代码更易于阅读。

比,可能,虽然调用外部“排序”可能对大文件有某些设施(>可用内存的数量) - 除非你与这些不一致,否则你可能会弄错。

与 shell 脚本不同,Python 是自包含的,因为它可以在内部使用您的数据执行大多数任务,而不是通过外部简单的 posix 程序传递数据。

要对名为“input”的文件进行排序并准备好在内存中使用的结果,只需执行以下操作:

# read the data into a list, one line per item:
data = open("input", "rt").readlines()
# sort it, splitting the line on tab characters and taking the first two as key:
data.sort(key=lambda line: line.split("\t")[:2]

# and "data" contains a sorted list of your lines
于 2013-06-06T20:11:14.310 回答