在Python 2.7中,如何使用scp和变量文件名?

0 投票
3 回答
1344 浏览
提问于 2025-04-18 14:14

我在使用Python 2.7写代码,操作系统是CentOS 6。现在我刚开始学习Python。

下面这段代码可以把远程机器192.168.13.152上/2013_06_02文件夹里所有包含字母“R”的特定文件复制到我的本地机器上 (tony是我本地机器的用户名,而john是远程机器的用户名)

os.system("scp john@192.168.13.152:/home/john/2013_06_02/11_RBPLJ1635+3808*R* /home/tony/data/")

这段代码可以正常工作。(这段代码会要求输入密码)。我可以在本地机器的/data目录下找到这些特定文件。

现在的问题是:其实我在远程机器上有很多文件夹,每个文件夹里都有很多文件名包含字母“R”。而且每个文件名的开头都有一些数字,比如上面的例子是11。现在我想改变文件夹的名字,同时也想改变文件名前面的数字。

我试过这样做:

date = "2013_10_05"
mynum = "11"
os.system("scp john@192.168.13.152:/home/john/date/mynum_RBPLJ1635+3808*R* /home/tony/data/")

但是我遇到了这个错误:

SyntaxError: EOL while scanning string literal

我也试过这种方式:

date = "2013_10_05"
mynum = "11"
os.system("scp john@192.168.13.152:/home/john/"date"/"mynum"_RBPLJ1635+3808*R* /home/tony/data/")

但这也没有成功。

总之,我需要把文件夹名和文件前面的数字变成两个变量,这样在scp命令中使用,就可以自动化复制过程;也就是说,我不需要每次手动更改文件夹名和文件名中的数字。

我知道每次运行这段代码时都需要输入远程机器的密码,但我现在不太在意这个。首先,我想让上面的代码能够正常工作。然后我想看看如何在不每次输入密码的情况下完成这个操作。

任何帮助都会非常感谢。提前谢谢大家。

3 个回答

0

还有一种运行的方法是:

date = "2013_10_05"
mynum = "11"
os.system("scp john@192.168.13.152:/home/john/%s/%s_RBPLJ1635+3808*R* /home/tony/data/" %(date, mynum))
1

使用字符串格式化。

date = "2013_10_05"
mynum = "11"
os.system("scp john@192.168.13.152:/home/john/{}/{}_RBPLJ1635+3808*R* /home/tony/data/".format(date, mynum))

我建议你看看 fabric。这个工具在这方面非常好用。

2

使用 str.format 方法可以传入变量:

date = "2013_10_05"
mynum = "11"
os.system("scp john@192.168.13.152:/home/john/{}/{}_RBPLJ1635+3808*R* /home/tony/data/".format(date,mynum))

在这里:

os.system("scp john@192.168.13.152:/home/john/"date"/"mynum"_RBPLJ1635+3808*R* /home/tony/data/") 这个写法里面有双引号嵌套在双引号里,这在Python中既不合法,也无法正确传入变量。

撰写回答