如何将一个zip文件移动到一个文件夹

问题描述:

我有一个很大的没有。名称仅为数字的zip文件。现在,每个zip文件都包含一个与zip文件具有相同名称的文件夹(即,如果zip文件的名称是1234.zip,那么文件夹的名称也将是1234)。此文件夹还包含一个文本文件,其中包含atextfile.txt,其中包含指定zip年份的整数,例如2016.
现在我想将每个zip文件移动到其各自的文件夹,即一年一度。意思是我想要做的是提取年的价值,即2016年,并创建一个名为2016的文件夹,将zip文件移动到此文件夹,并为下一个zip文件执行相同的操作。
我成功检索年份并将其存储在名为year的变量中。
到目前为止我写的代码:如何将一个zip文件移动到一个文件夹

import glob 
    import os 
    import zipfile 
    import shutil 
    for zip_name in glob.glob('[0-9]*.zip'): 
     z=zipfile.ZipFile(zip_name) 
     # To remove '.zip' from the name of zip_name 
     subdir = zip_name[:-4] 
     with z.open('{}/atextfile.txt'.format(subdir)) as f: 
      for line in f: 
       for word in line: 
        year = word 
        # the file atextfile.txt has many lines containing many      integer of which the first line represents the year. 
        break 
       else: 
        continue 
       break 
     z.close() 
     if not os.path.exists(year): 
      os.makedirs(year) 
     shutil.move(zip_name, year) 


这是给出了错误:
WindowsError:[错误32],因为它被另一个进程的进程不能访问该文件。
我用Google搜索了一下,然后我才知道这背后的原因是因为我的zip文件已经打开。但我无法解决这个问题,所以请帮助。
更新:问题已解决我将zip_name和year存储在文本文件中,然后在另一个程序中读取文本文件并将相应的zip文件移至其year文件夹。感谢您的回复。

+0

确保您没有文件夹打开。看看你的活动计划。你打开文件夹了吗? – TheLazyScripter

Try with subprocess and ROBOCOPY:

import glob 
import os 
import zipfile 
import subprocess 

for zip_name in glob.glob('[0-9]*.zip'): 
    z = zipfile.ZipFile(zip_name) 
    # To remove '.zip' from the name of zip_name 
    subdir = zip_name[:-4] 
    with z.open('{}/atextfile.txt'.format(subdir)) as f: 
     for line in f: 
      for word in line: 
       year = word 
       break 
      else: 
       continue 
      break 
    z.close() 
    if not os.path.exists(year): 
     os.makedirs(year) 
    command = 'ROBOCOPY {} {} /S /MOVE'.format(zip_name, year) 
    subprocess.call(command) 
+0

它显示错误:错误123(0x0000007B)访问源目录E:\ Meta_files \ 1.zip \ 文件名,目录名称或卷标语法不正确。 –

我下面的作品,似乎与你都拿到年度途中的一个问题。

import glob 
import os 
import zipfile 
import shutil 

for zip_name in glob.glob('[0-9]*.zip'): 
    z = zipfile.ZipFile(zip_name) 
    subdir = os.path.splitext(zip_name)[0] 

    with z.open('{}/atextfile.txt'.format(subdir)) as f: 
     for line in f: 
      line = line.strip() 
      if line.lower().startswith("date"): 
       year = line.split('-')[-1] 
       break 

    if not os.path.exists(year): 
     os.makedirs(year) 

    z.close() 
    shutil.move(zip_name, year) 

而且,最好是使用os.path.splitext()函数来提取您的zip_name

+0

我试过了,但它仍然不能正常工作。文件中的数据格式稍有不同。它包含许多行,每行看起来像这样:attribute = value ex。日期= 2013年7月23日。所以我不得不提取2013年的第一个使用:在line.split('=')中的单词,然后在某些情况下,它是这样的:Date = 23-JUL-2013,所以我必须写:word = word。跳闸()。然后,我必须找到Date这个词,然后将整个日期存储在一个变量中,例如变量具有值23-JUL-2013,然后提取我编写year = variable [: - 4]的年份。希望这有助于某种方式。 –

+0

您的代码是否创建了正确的文件夹?即如果你注释掉'shutil.move()'它是否创建了一切? –

+0

我已更新脚本以使用您的文件格式。 –