【问题标题】:Move required files where they need to go将所需文件移动到需要去的地方
【发布时间】:2011-04-20 02:35:21
【问题描述】:

我正在编写一个 Python 脚本,该脚本解压缩一个压缩目录并安装一些文件。解压缩压缩文件时,可能会有./usr/bin/package./var/lib/package 之类的文件。解压缩的目录包含它们实际需要去的目录的名称。假设目录结构如下所示:


./zippedfile.zip
./usr
    /bin
        /package
./var
    ./lib
        ./package
现在我需要将所需的文件移动到他们需要去的地方。例如,我需要将./usr/bin/package 移动到实际的/usr/bin/ 目录。问题是,可能存在哪些文件夹是不可预测的,因此脚本需要找到所需的目录并移动它们。谢谢,希望我把问题说清楚了。

【问题讨论】:

  • 那么一切都与/相关吗?
  • 是的。如果我有文件./usr/bin/package 我想将它移动到/usr/bin/package

标签: python file directory move


【解决方案1】:

使用 zipfile 模块读取 zip 文件并使用extract(name, dest) 提取每个文件。例如:

import sys
import zipfile

def unzip(path, root='/'):
    zh = zipfile.ZipFile(path, 'r')
    for name in zh.namelist():
        zh.extract(name, root)
    zh.close()

unzip(sys.argv[1])

如果 zip 中的文件的路径为 ./usr/bin/script,它将被提取到 /usr/bin/script

用法:

% python unzip.py myfiles.zip

更新:要处理焦油,请使用tarfile module。这会使用文件扩展名(gzip、bzip2)检测压缩类型:

import os
import sys
import tarfile

def untar(path, root='/'):
    mode = 'r'
    _, ext = os.path.splitext(path)
    if ext in ('.gz', '.bz2'):
        mode += ':' + ext[1:]
    th = tarfile.open(path, mode)
    for info in th.getmembers():
        th.extract(info, root)
    th.close()

untar(sys.argv[1])

更新如果您不能使用 zipfile 或 tarfile 模块,您可以调用相应的系统命令来获得相同的结果:

import os
import subprocess
import sys

def untar(path, root):
    subprocess.call(['tar', '-C', root, '-xf', path])

def unzip(path, root):
    subprocess.call(['unzip', os.path.abspath(path)], cwd=root)

path = sys.argv[1]
dest = os.path.abspath(sys.argv[2])
if not os.path.exists(dest):
    os.makedirs(dest)
if path.endswith('.zip'):
    unzip(path, dest)
else:
    untar(path, dest)

【讨论】:

  • 啊好吧。有什么办法可以用一个 tarred 文件来做到这一点,而不仅仅是一个 zip 文件?
  • 谢谢。没有任何额外的模块,如 tarfile 或 zipfile,有什么方法可以做到这一点?
  • 酷,很高兴它有帮助。我已经通过调用系统命令来提取档案的示例更新了答案。
  • 啊有趣。它会将它们移动到需要的位置,而不会覆盖关键的系统文件?
  • 您需要使用 tarfile/zipfile 解决方案,并在读取每个文件时使用 os.path.exists() 在提取和覆盖之前确定该路径是否已经存在。
【解决方案2】:

据我了解,您需要的大部分内容都在标准库的 os.path 模块中。那里有一些有用的功能:

  • os.path.exists:如果路径引用现有路径,则返回 True。对于损坏的符号链接返回 False。在某些平台上,如果未授予对请求的文件执行 os.stat() 的权限,即使路径物理存在,此函数也可能返回 False。

  • os.path.isdir:如果路径是现有目录,则返回 True。这遵循符号链接,因此 islink() 和 isdir() 对于同一路径都可以为真。

如果您需要调用 shell 命令来实际移动目录,您也可以使用标准库中的 subprocess 模块 (see documentation here)。

希望这会有所帮助。

【讨论】:

    【解决方案3】:
    
    import zipfile, os
    zipped = zipfile.ZipFile('zippedfile.zip')
    os.chdir('/')
    zipped.extractall()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多