我在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语句时,我得到了同样的错误,所以我对如何在这里指定字符串的理解一定有问题。
有没有人对这是什么原因有任何想法?我一直无法找到解决方案,但我发现这个问题很难找到。
答案 0 :(得分:2)
在不知道你的实际字符串是什么的情况下,无法确定问题是什么。但是,它几乎肯定与未能正确引用和/或转义命令行的参数有关。
我的第一个猜测是你的文件名中间有一个换行符,而shell正在截断换行符处的命令。但我不会过分沉重。如果你真的打印出路径名的repr,我可以肯定地告诉你。但为什么要经历这一切头痛?
解决os.system
几乎所有问题的方法是不使用os.system
。
如果你看the docs,他们甚至会告诉你:
subprocess
模块提供了更强大的工具来生成新流程并检索其结果; 使用该模块比使用此功能更受欢迎。有关一些有用的配方,请参阅subprocess
文档中的Replacing Older Functions with thesubprocess
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行。