0

我正在编写一段代码,在其中我希望它进入主终端并剥离我的 [] 和 '' 数据集但是当我包含 '' 部分时,python 认为我刚刚完成了字符串(我认为)还有另一种方法可以做到这一点。这是我的代码:

com=['cat new.txt | tr -d "s/,[]''*//g" >meantenbri.txt']
s0=''
com=s0.join(com)
res=os.system(com)

python 不承认我希望在终端中执行整行,特别是中间部分的''。

4

3 回答 3

3

'cat new.txt | tr -d "s/,[]''*//g" >meantenbri.txt2'没有做你认为的事情,例如:

>>> print 'cat new.txt | tr -d "s/,[]''*//g" >meantenbri.txt2'
cat new.txt | tr -d "s/,[]*//g" >meantenbri.txt2

请注意,中间的那两个单引号消失了,这是因为您实际上有两个单独的字符串并排在一起,'cat new.txt | tr -d "s/,[]'并且
'*//g" >meantenbri.txt2'解释器将这些字符串连接在一起。要在字符串中实际包含这些单引号,有几个选项:

  • 使用三重引号:
    com = """cat new.txt | tr -d "s/,[]''*//g" >meantenbri.txt2"""
  • 转义中间的单引号:

    com = 'cat new.txt | tr -d "s/,[]\'\'*//g" >meantenbri.txt2'
    

请注意,整个com = [...], s0 = '',com = ''.join(com)确实是不必要的,只需com通过删除方括号从头开始创建为字符串。

作为旁注,subprocess.Popen()优先os.system()于运行外部程序。我认为在这种情况下,它看起来像这样(未经测试):

import subprocess
cmd = ['tr', '-d', "s/,[]''*//g"]
p = subprocess.Popen(cmd, stdin=open('new.txt'),
                     stdout=open('meantenbri.txt2', 'w'))
p.communicate()
res = p.returncode

尽管正如 Sven 在评论中提到的那样,这不是您应该首先使用外部程序的东西。

于 2013-06-04T16:39:56.883 回答
2

改用三引号字符串:

com = ["""cat new.txt | tr -d "s/,[]''*//g" >meantenbri.txt"""]

python 实际上有 4 种类型的引号供您使用:

'...'
"...:
"""..."""
'''...'''

(三重引号也适用于多行):

"""foo
bar"""

当然,如果你真的很紧张,你可以用反斜杠转义引号——但是有这么多不同类型的引号可供你使用,它似乎很少需要。

于 2013-06-04T16:38:59.567 回答
1
com=['cat new.txt | tr -d "s/,[]\'\'*//g" >meantenbri.txt2']

用 \ 逃脱它们

于 2013-06-04T16:37:05.113 回答