3

我刚开始学习python并有一个问题。

如何创建一个脚本来执行以下操作:(将写我在 bash 中的操作方式)

  1. 从远程 server1复制<file>.gz到本地存储。

    cp /dumps/server1/file1.gz /local/

  2. 然后在本地提取该文件。

    gunzip /local/file1.gz

  3. 然后将提取文件复制到远程 server2(用于归档和重复数据删除)

    cp /local/file1.dump /dedupmount

  4. 删除 .gz 文件的本地副本以释放“临时”存储空间

    rm -rf /local/file1.gz

我需要为所有文件循环运行所有这些。所有文件和目录都安装在同一台服务器上的 NFS。

for 循环遍历/dump/文件夹并查找.gz文件。每个.gz文件将首先复制到/local目录,然后在那里提取。解压后,解压后的.dmp文件将被复制到/dedupmount文件夹进行归档。

只是把我的头撞在墙上如何写这个。

4

2 回答 2

17

Python 解决方案

虽然 shell 代码可能更短,但整个过程可以在 python 中本地完成。python解决方案的关键点是:

  • 使用该gzip模块,gzip 压缩文件与普通文件一样易于阅读。

  • 要获取源文件列表,请glob使用该模块。它以 shell glob 特性为模型。

  • 要操作路径,请使用 pythonos.path模块。它为文件系统提供了一个独立于操作系统的接口。

这是示例代码:

import gzip
import glob
import os.path
source_dir = "/dumps/server1"
dest_dir = "/dedupmount"

for src_name in glob.glob(os.path.join(source_dir, '*.gz')):
    base = os.path.basename(src_name)
    dest_name = os.path.join(dest_dir, base[:-3])
    with gzip.open(src_name, 'rb') as infile:
        with open(dest_name, 'wb') as outfile:
            for line in infile:
                outfile.write(line)

此代码从 remote1 服务器读取并写入 remote2 服务器。除非您需要,否则不需要本地副本。

在这段代码中,所有的解压都是由本地机器上的 CPU 完成的。

外壳代码

为了比较,下面是等效的 shell 代码:

for src in /dumps/server1/*.gz
do
    base=${src##*/}
    dest="/dedupmount/${base%.gz}"
    zcat "$src" >"$dest"
done

三步 Python 代码

这种稍微复杂一点的方法实现了 OP 的三步算法,该算法使用本地机器上的临时文件:

import gzip
import glob
import os.path
import shutil

source_dir = "./dumps/server1"
dest_dir = "./dedupmount"
tmpfile = "/tmp/delete.me"

for src_name in glob.glob(os.path.join(source_dir, '*.gz')):
    base = os.path.basename(src_name)
    dest_name = os.path.join(dest_dir, base[:-3])
    shutil.copyfile(src_name, tmpfile)
    with gzip.open(tmpfile, 'rb') as infile:
        with open(dest_name, 'wb') as outfile:
            for line in infile:
                outfile.write(line)

这会将源文件复制到本地计算机上的临时文件tmpfile,然后将其从那里枪压缩到目标文件。 tmpfile将被此脚本的每次调用覆盖。

临时文件可能是一个安全问题。为避免这种情况,请将临时文件放在只有运行此脚本的用户才能写入的目录中。

于 2014-10-26T21:34:59.990 回答
0

你可以使用模块 urlopen

import urllib
#urlretrieve will save the file to local drive
urllib.urlretrieve(url,file_name_to_save)

现在你可以使用 gunzip utitlty 来解压,使用 os.system

于 2014-10-26T20:59:22.693 回答