用os模块覆盖python文件

时间:2015-07-11 17:33:27

标签: python directory operating-system copy shutil

我正在编写一个将文件从一个文件夹移动到另一个文件夹的程序。有时我会在此过程中覆盖文件。无论何时我运行文件,我都被问及#34;覆盖C:......(是/否/全部)"。我希望我的程序始终选择" All"自动。提前谢谢

import os
from tkinter import *
screen = Tk()
sourceplayers = 'C:\\Program Files (x86)\...\players' 
destinationplayers = 'C:\\memory\Will\players'
sourceuserdata = ('C:\\\\Program Files (x86)\...\remote'
destinationuserdata = 'C:\\\\memory\\Will\\remote'

def copyout(): 
    os.system ("""xcopy "%s" "%s" """ % (sourceplayers, destinationplayers)) 
    os.system ("""xcopy "%s" "%s" """ % (sourceuserdata, destinationuserdata)) #save


def movein():
    os.system ("""xcopy "%s" "%s" """ % (destinationplayers, sourceplayers))
    os.system ("""xcopy "%s" "%s" """ % (destinationuserdata, sourceuserdata))  

button = Button(screen, text="save", command=copyout)
button1 = Button(screen, text="overwrite", command=movein)
button.pack()
button1.pack()
screen.mainloop()

4 个答案:

答案 0 :(得分:2)

那是因为您正在使用系统调用来进行移动。您可以使用os.listdir的组合列出源代码中的所有文件和目录,并使用shutil.move进行移动。

答案 1 :(得分:1)

根据TechNet docsxcopy看起来像/y标记“禁止提示确认您要覆盖现有目标文件。”

我想你会像这样使用它:

os.system ("""xcopy "%s" "%s" /y""" % (sourceplayers, destinationplayers))

答案 2 :(得分:1)

您可以将/y开关作为xcopy命令的一部分传递给始终覆盖文件,但如果您严格按照提问提供输入(全选),请尝试https://github.com/pexpect/pexpect < / p>

答案 3 :(得分:1)

如果你不能使用旗帜。您可以尝试使用subprocess.Popen写入stdin,这应该完全符合您的要求:

from subprocess import PIPE,Popen

p = Popen(["xcopy",sourceplayers, destinationplayers],stdin=PIPE)
p.stdin.write("All\n")
p = Popen(["xcopy",sourceuserdata, destinationuserdata],stdin=PIPE)
p.stdin.write("All\n")

无论哪种方式你都应该在os.system上使用子进程模块,subprocess是os.popen,os.system等的替代品。

如果/y适用于所有文件,请使用subprocess.check_call

from subprocess import check_call

check_call(["xcopy","/y",sourceuserdata, destinationuserdata])

如果您希望在下一次运行之前返回上一个命令,请在每次调用之间放置p.wait()以等待进程返回。

如果您要替换文件,那么您不需要在python之外查看,可以使用shutil.move

from shutil import move
move(sourceplayers, destinationplayers)