移动所需文件到正确位置

0 投票
3 回答
624 浏览
提问于 2025-04-16 16:04

我正在写一个Python脚本,用来解压一个压缩的文件夹并安装一些文件。当你解压这个压缩文件时,可能会看到像 ./usr/bin/package./var/lib/package 这样的文件。解压后的文件夹里包含了这些文件应该放到的目录名称。假设文件夹的结构看起来是这样的:


./zippedfile.zip
./usr
    /bin
        /package
./var
    ./lib
        ./package
现在我需要把这些需要的文件移动到它们应该去的地方。比如,我需要把 ./usr/bin/package 移动到实际的 /usr/bin/ 目录。问题是,可能会有很多不同的文件夹,所以这个脚本需要找到这些需要的目录并把文件移动过去。谢谢,希望我把问题说清楚了。

3 个回答

0

在这个代码块中,我们可以看到一些编程相关的内容。这个内容可能涉及到一些特定的编程语言或技术,但我们不需要担心这些细节。重要的是理解它的基本功能和用途。

通常,代码块里的内容是用来解决某个问题或者实现某个功能的。即使你对编程不太了解,看到这些代码也可以帮助你理解程序是如何工作的。每一行代码都有它的作用,就像一个食谱,每一步都是为了做出美味的菜肴。

如果你想深入了解这些代码的具体含义,可以尝试逐行分析,看看每一部分是做什么的。这样,你就能慢慢掌握编程的基本概念了。


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

根据我的理解,你需要的很多功能都在标准库里的 os.path 模块中。这里有一些有用的函数:

  • os.path.exists:如果路径指向一个存在的文件或文件夹,就返回 True。如果是坏掉的符号链接(类似快捷方式),则返回 False。在某些系统上,如果没有权限去执行 os.stat() 来检查这个文件,即使路径确实存在,这个函数也可能返回 False。

  • os.path.isdir:如果路径是一个存在的文件夹,就返回 True。这个函数会跟随符号链接,所以同一个路径用 islink() 和 isdir() 都可能返回 True。

如果你需要执行一些命令来真正移动文件夹,可以使用标准库中的 subprocess 模块(这里有文档)。

希望这些信息对你有帮助。

3

使用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

更新:如果要处理tar文件,可以使用tarfile模块。这个模块会根据文件的扩展名(比如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)

撰写回答