使用cp命令在Python中复制文件或更改文件名

3

我想使用Python在Linux上运行cp命令,从而复制文件。这是我的代码:

newfile = "namePart1" + dictionary[key] + "namePart2"

os.system("cp cfn5e10_1.lp newfile")

我该如何使第二行的文本newfile被替换为我在前一行计算出来的变量newfile


1
你确定你是这样调用os.system的吗?因为它会将原始文件复制到一个名为“newfile”的文件中(而不是变量newfile中所说的任何内容)。 - Savir
2
最好询问在Python中复制或重命名文件的最佳方法,而不是询问如何使用cpmv - Charles Duffy
根据问题描述,这个问题本身就没有意义:显然的问题是"cp cfn5e10_1.lp newfile"中包含了实际文本newfile而不是newfile变量的内容。然而,OP已经明显知道如何解决这个问题——因为前一行代码中写着newfile = "namePart1" + dictionary[key] + "namePart2",而不是newfile = "namePart1 dictionary[key] namePart2",并且也没有关于如何替换该值的问题。因此,它应该被关闭为拼写错误(或者在2012年的说法中是“过于局限”)。 - Karl Knechtel
考虑到这个问题,有两种方法可以理解:一种是我们可以忽略安装的问题,将其视为一个关于字符串插值的严肃问题;或者我们可以忽略 OP 尝试不合适的方法来解决问题的问题,将其视为一个关于文件复制的严肃问题。然而,这两个都是极其常见的重复问题,而且已经有更好的版本可用;因此我将其关闭为两个的重复,并建议应将其删除 - 这里没有增加价值。 - Karl Knechtel
我猜,仅从标题来看,我们可以把这个问题看作是关于如何从Python中运行操作系统命令的问题。但是OP已经知道了基本的语法,而且也有更好的重复提问,因此我们不妨就让这个问题搁置吧。 - Karl Knechtel
3个回答

13

使用 shutil.copyfile 来复制文件,而不是使用 os.system。它不需要创建新进程并且可以自动处理包含非常规字符(例如空格)的文件名,而 os.system 只是将命令传递给 shell,shell 可能会对其中具有空格等空白字符的文件名进行分割,或出现其他可能的问题。

例如:

newfile = "namePart1" + dictionary[key] + "namePart2"
shutil.copyfile("cfn5e10_1.lp", newfile)

这个方法不幸的是并不适用于所有文件类型。例如,使用copyfile复制格式化的xls文件时,它将无法保留其格式。但对于OP来说,这应该可以完成工作。 - Red-Tune-84
@Kazanz:嗯,什么?格式化的Excel文档与任何事情有什么关系?你能更具体一些吗?如果存在,shutil.copyfile很可能不会复制文件的备用数据流,但我不知道Excel文件使用备用数据流的任何用途。 - Adam Rosenfield
是的,你说得对。shutil.copyfile就是解决方案,OP只需注意它不会复制文件元数据的警告。请参见此处的警告。“在POSIX平台上,这意味着文件所有者和组以及ACL将丢失。在Mac OS上,资源fork和其他元数据未被使用。这意味着资源将丢失,文件类型和创建者代码将不正确。在Windows上,不会复制文件所有者、ACL和备用数据流。”- Python文档 - Red-Tune-84

4
这不会用你的变量替换newfile
os.system("cp cfn5e10_1.lp newfile")

您需要将变量连接到字符串的末尾,如下所示:
os.system("cp cfn5e10_1.lp " + newfile)

2
这个代码不够安全 -- 如果newfile包含空格,它无法防止其被分割成多个单词。 - Charles Duffy
请保留空格,如 os.system("cp " + given_dir + " " + out_dir) - Cloud Cho

2
如果你想从Python中调用cp,请使用subprocess模块:
subprocess.call(["cp", "cfn5e10_1.lp", "newfile"])

但最好使用shutil模块中的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接