0

我是一个有点 Python/编程的新手,我第一次尝试使用 python 类。

在这段代码中,我试图创建一个脚本来备份一些文件。我总共有 6 个文件,我想用这个脚本定期备份,所以我想我会尝试使用 python 类来节省我写东西的时间 6 次,也可以练习使用类。

在下面的代码中,我设置了一些东西,现在只创建一个类的实例来测试东西。然而,我遇到了一个障碍。我似乎无法使用运算符来分配原始文件名和备份文件名。

打开文件时不能使用运算符作为文件名吗?或者我做错了什么。

class Back_up(object):
    def __init__(self, file_name, back_up_file):
        self.file_name = file_name
        self.back_up_file = back_up_file
        print "I %s and me %s" % (self.file_name, self.back_up_file)

        with open('%s.txt', 'r') as f, open('{}.txt', 'w') as f2 % (self.file_name, self.back_up_file):
            f_read = read(f)
            f2.write(f_read)

first_back_up = Back_up("syn1_ready", "syn1_backup")

此外,第 7 行真的很长,任何关于如何缩短它的提示都值得赞赏。

谢谢达伦

4

2 回答 2

5

如果您只想备份文件,我可以建议使用shutil.copy()吗?

至于你的程序:

如果您想用字符串替换来构建文件名,您可以这样做。但是你的代码没有这样做。

你有这个:

with open('%s.txt', 'r') as f, open('{}.txt', 'w') as f2 % (self.file_name, self.back_up_file):

试试这个:

src = "%s.txt" % self.file_name
dest = "{}.txt".format(self.back_up_file)
with open(src, "rb") as f, open(dest, "wb") as f2:
    # copying code goes here

运算符对%字符串进行操作。.format()方法调用是字符串上的方法。无论哪种方式,您都需要对字符串进行操作;您不能有两个语句,然后尝试在语句行with的末尾使用这些运算符。with

您不必像我在这里展示的那样使用显式临时变量,但这是使代码易于阅读的好方法,同时大大缩短了with语句行的长度。

您复制文件的代码将一次将所有文件数据读入内存。这对于一个小文件来说很好。对于大文件,您应该使用一个循环,该循环调用.read(CHUNK_SIZE)whereCHUNK_SIZE是在单个块中读取的最大数量。这样,如果您在内存有限的计算机上备份了一个非常大的文件,它只会工作,而不是填满计算机的内存并让计算机开始交换到磁盘。

于 2013-11-13T02:23:27.490 回答
2

尝试简单:)

您的第 7 行不会解析。使用中间变量拆分它:

source_fname = "%s.txt" % self.file_name
target_fname = "%s.txt" % self.back_up_file
with open(source_fname) as source, open(target_fname) as target:
  # do your thing

file_name此外,当您有两个文件要操作时,请尽量避免不一致和过于通用的属性名称,例如。

您的复制程序也不会非常有效。它尝试将整个文件读入内存,然后将其写入。如果我是你,我会打电话rsync或通过类似的方式popen()给它提供适当的文件列表以进行操作。很可能我会使用bash它,尽管 Python 也可能很好。

于 2013-11-13T02:30:11.903 回答