2016-06-07 65 views
0

我需要将文件从我的NAS复制到我的本地文件夹,然后将其压缩并复制到别处。这是我的代码:使用python复制压缩文件

from shutil import copyfile 
import zipfile 

def make_done_file(user, filename): 
    copyfile(network_location+filename+'.csv', test_location+filename+'.csv') 
    zip_file = zipfile.ZipFile(test_location+filename+'.csv.zip', 'w') 
    zip_file.write(test_location+filename+'.csv', compress_type= None, arcname = filename+'.csv') 
    copyfile(test_location+filename+'.done' , final_location+filename+'.done') 
    copyfile(test_location+filename+'.csv.zip' , final_location+filename+'.csv.zip') 

这里的东西..

我能够从拉链打开我的csv后,我创建它。 我无法在复制文件后打开csv。

我目前用完了想法。试过copy2,没有帮助。任何人有任何想法可能会出错?

在此先感谢!

Ofek。

回答

0

复制之前您可能需要closezip_file; copyfile将单独打开文件,如果数据未刷新到磁盘,它将复制一个不完整的文件(尤其是不好的,因为您可能会忽略解释内容所需的zip文件元数据)。

The zipfile docs明确说明:

您必须调用close()退出程序前或必要记录将不被写入。

由于您使用Python 3中,你可以通过使close呼叫隐式和保证(即使在异常的情况下)进一步简化,使用上下文经营(with语句),使该自动关闭块该块被退出时的zip文件。

更改您的代码:

def make_done_file(user, filename): 
    copyfile(network_location+filename+'.csv', test_location+filename+'.csv') 
    with zipfile.ZipFile(test_location+filename+'.csv.zip', 'w') as zip_file: 
     zip_file.write(test_location+filename+'.csv', compress_type=None, arcname=filename+'.csv') 
    copyfile(test_location+filename+'.done', final_location+filename+'.done') 
    copyfile(test_location+filename+'.csv.zip', final_location+filename+'.csv.zip') 

另外,如果你有一些其他进程寻找.done文件,你可能想先复制压缩,那么.done,这样的存在.done表示一个完整的zip文件已被复制,而不是“它即将被复制,但如果你读得太快,它可能不完整”。

+0

谢谢!它的工作现在完美了! –