在python的os.system调用中指定文件名

时间:2013-11-19 23:17:55

标签: python os.system

我在python中创建一个简单的文件来重新组织我从网站上抓取的一些文本数据。我将数据放在.txt文件中,然后想使用“tail”命令去掉前5行。我可以使用下面显示的简单文件名来完成这项工作,但是当我尝试更改文件名(我真正想要的那样)时,我得到一个错误。我的代码:

start = 2010
end = 2010
for i in range(start,end+1)
    year = str(i)

  ...write data to a file called file...

    teamname=open(file).readline() # want to use this in the new filename
    teamfname=teamname.replace(" ","") #getting rid of spaces

    file2 = "gotdata2_"+year+".txt"
    os.system("tail -n +5 gotdata_"+year+".txt > "+file2)

上面的代码按预期工作,创建文件,然后创建排除前5行文件的file2。但是,当我将file2的名称更改为:

file2 = teamfname+"_"+year+".txt"

我收到错误:

sh:第1行:_2010.txt:找不到命令

就好像我的file2语句的结尾被切断了,而.txt部分没有被识别。在这种情况下,我的代码输出一个文件但最后缺少_2010.txt。我仔细检查过,year和teamfname都是字符串。我也在teamfname字符串中使用和不使用空格来尝试它。当我尝试包含一个将文件重命名为我想要的文件的os.system mv语句时,我得到了同样的错误,所以我对如何在这里指定字符串的理解一定有问题。

有没有人对这是什么原因有任何想法?我一直无法找到解决方案,但我发现这个问题很难找到。

1 个答案:

答案 0 :(得分:2)

在不知道你的实际字符串是什么的情况下,无法确定问题是什么。但是,它几乎肯定与未能正确引用和/或转义命令行的参数有关。

我的第一个猜测是你的文件名中间有一个换行符,而shell正在截断换行符处的命令。但我不会过分沉重。如果你真的打印出路径名的repr,我可以肯定地告诉你。但为什么要经历这一切头痛?

解决os.system几乎所有问题的方法是不使用os.system

如果你看the docs,他们甚至会告诉你:

  

subprocess模块提供了更强大的工具来生成新流程并检索其结果; 使用该模块比使用此功能更受欢迎。有关一些有用的配方,请参阅subprocess文档中的Replacing Older Functions with the subprocess Module部分。

如果您使用subprocess代替os.system,则可以完全避免使用shell。您还可以将参数作为列表传递,而不是试图弄清楚如何引用它们并正确地转义它们。这将完全避免你遇到的确切问题。

例如,如果你这样做:

file2 = "gotdata2_"+year+".txt"
with open(file2, 'wb') as f:
    subprocess.check_call(['tail', '-n', '+5', "gotdata_"+year+".txt"], stdout=f)

然后,如果您将第一行更改为:

file2 = teamfname+"_"+year+".txt"

即使teamfname中有空格或引号或其他特殊字符,它仍然有效。


话虽如此,我不确定你为什么要首先使用tail。你可以直接在Python中跳过前5行。