【问题标题】:OS commands in PythonPython 中的操作系统命令
【发布时间】:2014-07-31 13:21:39
【问题描述】:

以下命令在从 shell 执行时可以正常工作。我想在 python 脚本中做同样的事情(或者更确切地说,获得相同的输出)。但无论我做什么,我总是会遇到一些引号错误。我试过用 os.system...、subprocess.Popen...、shlex.split... 来实现这个,但没有任何运气。

comm -13 <(grep -e 77772 -e 77778 -e 777710 myfile1.dat |
             awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | 
             sort -t '.' -k 1,1 -k 2,2) \
         <(grep -e 77772 -e 77778 -e 777710 myfile2.dat |
             awk 'BEGIN {FS=";"} ; {print $8 "," $1}' |
             sort -t '.' -k 1,1 -k 2,2) |
      tee output.dat

(我基本上是从包含 77772 或 77778 或 777710 的两个文件中选择行,从这些行中选择两列(column1 和 column8),对它们进行排序以查找 myfile2.dat 独有的行 - 并将这些行写入输出.dat)。

有没有更简单的方法来做到这一点?

【问题讨论】:

  • “但无论我做什么,我总是会遇到一些引号错误”。请向我们展示一些产生引号错误的代码。
  • 文件有多大?将相关数据从myfile1.dat 读取到内存中,然后遍历myfile2.dat 并将独特的行写入标准输出和output.dat,这可能更简单。不要分叉出你可以在 Python 中轻松完成的事情。

标签: python pipe comm


【解决方案1】:

实际问题很容易回答

subprocess.call(['bash', '-c',
                 '''comm -13 '''
                 ''' <(grep -e 77772 -e 77778 -e 777710 myfile1.dat | '''
                 '''    awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | '''
                 '''    sort -t '.' -k 1,1 -k 2,2) '''
                 ''' <(grep -e 77772 -e 77778 -e 777710 myfile2.dat | '''
                 '''    awk 'BEGIN {FS=";"} ; {print $8 "," $1}' | '''
                 '''    sort -t '.' -k 1,1 -k 2,2) '''
                 ''' | tee output.dat'''],
               )

这会将您的整个管道作为单个字符串传递给bash 的实例。 (它使用相邻字符串的隐式连接来提高可读性。

但是,我建议完全在 Python 中实现这一点,而不是分叉多个进程。将myfile1.dat中的相关数据读入内存(假设不是太大),myfile2.dat中的处理线一次一个,如果在您从myfile1.dat中读取的数据中找不到其字段,则输出该行.

【讨论】:

  • 感谢您的回答!这些文件刚刚超过 5k 行。我会按照你的建议去做;将文件读入内存。
猜你喜欢
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多