我目前通过一堆不好记的AWK、sed、Bash和一小部分Perl来做我的文本文件操作。

我已经看到提到的一些地方,python很适合做这种事情。我如何使用Python来代替shell脚本,AWK, sed和朋友?


当前回答

如果你的文本文件操作通常是一次性的,可能在shell提示符下完成,你从python中不会得到更好的东西。

另一方面,如果你经常不得不一遍又一遍地做同样的(或类似的)任务,并且你必须为此编写脚本,那么python是很棒的——你可以很容易地创建自己的库(你也可以用shell脚本来做,但它更麻烦)。

这是一个很简单的例子。

import popen2
stdout_text, stdin_text=popen2.popen2("your-shell-command-here")
for line in stdout_text:
  if line.startswith("#"):
    pass
  else
    jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">"))
    # do something with jobID

还要检查sys和getopt模块,它们是您首先需要的。

其他回答

添加到前面的答案:检查pexpect模块处理交互式命令(adduser, passwd等)

如果你的文本文件操作通常是一次性的,可能在shell提示符下完成,你从python中不会得到更好的东西。

另一方面,如果你经常不得不一遍又一遍地做同样的(或类似的)任务,并且你必须为此编写脚本,那么python是很棒的——你可以很容易地创建自己的库(你也可以用shell脚本来做,但它更麻烦)。

这是一个很简单的例子。

import popen2
stdout_text, stdin_text=popen2.popen2("your-shell-command-here")
for line in stdout_text:
  if line.startswith("#"):
    pass
  else
    jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">"))
    # do something with jobID

还要检查sys和getopt模块,它们是您首先需要的。

我喜欢Python的一个原因是它比POSIX工具更加标准化。我必须反复检查每个比特是否与其他操作系统兼容。在Linux系统上编写的程序在OSX的BSD系统上可能无法正常工作。对于Python,我只需要检查目标系统是否有足够现代的Python版本。

更棒的是,用标准Python编写的程序甚至可以在Windows上运行!

Pythonpy是一个工具,可以方便地访问awk和sed的许多特性,但使用python语法:

$ echo me2 | py -x 're.sub("me", "you", x)'
you2

我刚刚发现了如何结合bash和ipython的最佳部分。到目前为止,这似乎比使用subprocess等更舒服。你可以很容易地复制现有bash脚本的大部分内容,例如以python的方式添加错误处理:) 这是我的结果:

#!/usr/bin/env ipython3

# *** How to have the most comfort scripting experience of your life ***
# ######################################################################
#
# … by using ipython for scripting combined with subcommands from bash!
#
# 1. echo "#!/usr/bin/env ipython3" > scriptname.ipy    # creates new ipy-file
#
# 2. chmod +x scriptname.ipy                            # make in executable
#
# 3. starting with line 2, write normal python or do some of
#    the ! magic of ipython, so that you can use unix commands
#    within python and even assign their output to a variable via
#    var = !cmd1 | cmd2 | cmd3                          # enjoy ;)
#
# 4. run via ./scriptname.ipy - if it fails with recognizing % and !
#    but parses raw python fine, please check again for the .ipy suffix

# ugly example, please go and find more in the wild
files = !ls *.* | grep "y"
for file in files:
  !echo $file | grep "p"
# sorry for this nonsense example ;)

请参阅IPython文档,了解系统shell命令并将其用作系统shell。