Python 将所需文件移到需要的位置

Python 将所需文件移到需要的位置,python,file,directory,move,Python,File,Directory,Move,我正在编写一个Python脚本,该脚本解压压缩目录并安装一些文件。解压压缩文件时,可能会有/usr/bin/package或/var/lib/package等文件。解压后的目录包含实际需要到达的目录的名称。假设目录结构如下所示: ./zippedfile.zip ./usr /bin /package ./var ./lib ./package ./zippedfile.zip /美国 /垃圾箱 /包装 /var /lib /包 现在我需要将

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

./zippedfile.zip
./usr
    /bin
        /package
./var
    ./lib
        ./package

./zippedfile.zip
/美国
/垃圾箱
/包装
/var
/lib
/包

现在我需要将所需文件移动到需要的位置。例如,我需要将
/usr/bin/package
移动到实际的
/usr/bin/
目录。问题是,无法预测可能存在哪些文件夹,因此脚本需要找到所需的目录并移动它们。谢谢,希望我能把问题说清楚。

使用zipfile模块读取zip文件,然后
提取(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
更新:要处理TAR,请使用。这将使用文件扩展名(gzip、bzip2)检测压缩类型:

已更新如果无法使用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)

使用zipfile模块读取zip文件,并
提取(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
更新:要处理TAR,请使用。这将使用文件扩展名(gzip、bzip2)检测压缩类型:

已更新如果无法使用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)

据我所知,您需要的大部分是标准库中的
os.path
模块。这里有一些有用的功能:

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

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

如果需要调用shell命令来实际移动目录,那么也可以在标准库中使用
子流程
模块()


希望这有帮助。

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


import zipfile, os
zipped = zipfile.ZipFile('zippedfile.zip')
os.chdir('/')
zipped.extractall()
  • :如果路径引用现有路径,则返回True。对于断开的符号链接,返回False。在某些平台上,如果未授予对请求文件执行os.stat()的权限,则此函数可能返回False,即使路径实际存在

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

如果需要调用shell命令来实际移动目录,那么也可以在标准库中使用
子流程
模块()


希望这能有所帮助。

一切都与/那么相关吗?是的。如果我有文件
/usr/bin/package
,我想将其移动到
/usr/bin/package
中,所有内容是否都与/then相关?是的。如果我有文件
/usr/bin/package
我想把它移到
/usr/bin/package
好的。有什么方法可以做到这一点,比如说一个tarred文件,而不仅仅是一个zip文件?谢谢。没有任何额外的模块,如tarfile或zipfile,有没有办法做到这一点?很酷,很高兴它的帮助。我用一个调用系统命令提取归档文件的例子更新了答案。啊,很有趣。它会在不覆盖关键系统文件的情况下将它们移动到需要的位置?您需要使用tarfile/zipfile解决方案,在读取每个文件时,使用os.path.exists()确定路径是否已经存在,然后再提取和覆盖它。啊,好的。有什么方法可以做到这一点,比如说一个tarred文件,而不仅仅是一个zip文件?谢谢。没有任何额外的模块,如tarfile或zipfile,有没有办法做到这一点?很酷,很高兴它的帮助。我用一个调用系统命令提取归档文件的例子更新了答案。啊,很有趣。它会在不覆盖关键系统文件的情况下将它们移动到需要的位置?您需要使用tarfile/zipfile解决方案,在读取每个文件时,使用os.path.exists()确定路径是否已经存在,然后再提取和覆盖它。

import zipfile, os
zipped = zipfile.ZipFile('zippedfile.zip')
os.chdir('/')
zipped.extractall()