我的檔案名是
file_name = '19-00165_my-test - Copy (7)_Basic_sample_data'
我的功能就像
call("rm -rf /tmp/" file_name '.csv', shell=True)
但收到此錯誤
/bin/sh: -c: 第 0 行:意外標記 `(' 附近的語法錯誤
uj5u.com熱心網友回復:
我的回答總是:不要在檔案中使用空間。
但是,如果您真的想要這個,那么您應該將檔案放在引號中,如下所示:
call("rm -f '/tmp/{0}.csv'".format(file_name), shell=True)
uj5u.com熱心網友回復:
你為什么用shell=True?這意味著命令將被傳遞給 shell 進行決議,這就是造成所有麻煩的原因。使用shell=False,您傳遞一個由命令及其引陣列成的串列,每個命令作為一個單獨的串列元素(而不是所有混合在一起作為單個字串)。由于檔案名從不經過 shell 決議,因此不會被錯誤決議。
call(["rm", "-rf", "/tmp/" file_name '.csv'], shell=False)
uj5u.com熱心網友回復:
為了避免出現未轉義字符的問題,一種方法是使用該shlex模塊:
您可以使用該quote()函式來轉義字串,它回傳字串的外殼轉義版本:
import shlex
file_name = "19-00165_my-test - Copy (7)_Basic_sample_'data"
call(f"rm -f /tmp/{shlex.quote(file_name)}.csv", shell=True)
# rm -rf /tmp/'19-00165_my-test - Copy (7)_Basic_sample_'"'"'data'.csv
您還可以使用join():
import shlex
file_name = "19-00165_my-test - Copy (7)_Basic_sample_'data"
call(shlex.join(["rm", "-f", f"/tmp/{file_name}.csv"]), shell=True)
# rm -f '/tmp/19-00165_my-test - Copy (7)_Basic_sample_'"'"'data.csv'
注意:此答案僅在shell=True需要使命令作業時才有效。否則@Gordon Davisson 的答案要容易得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447748.html
上一篇:宣告BASH。腳本中的字串陣列
