Python—使用类时使用运算符指定文件名

Python—使用类时使用运算符指定文件名,python,class,operators,Python,Class,Operators,我是一个Python/编程新手,我第一次尝试使用Python类 在这段代码中,我试图创建一个脚本来备份一些文件。我总共有6个文件,我想用这个脚本定期备份,所以我想我应该尝试使用python类来节省我写东西6次的时间,同时也可以练习使用类 在下面的代码中,我设置了一些东西,现在只创建一个类的实例来测试这些东西。然而,我遇到了一个障碍。我似乎无法使用运算符来分配原始文件名和备份文件名 打开文件时,是否不能将运算符用作文件名?还是我做错了什么 class Back_up(object): de

我是一个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行非常长,任何关于如何缩短它的提示都非常感谢

谢谢
Darren

如果您只是想备份文件,我建议您使用
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
语句行末尾尝试使用这些运算符

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

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

试试简单:)

您的第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\u name


你的复印程序也不会很有效率。它尝试将整个文件读入内存,然后写入。如果我是你的话,我会通过
popen()
调用
rsync
或类似的东西,并向它提供适当的文件列表以供操作。很可能我会使用
bash
,尽管Python可能也不错。

很好的解释。您唯一没有提到的是,
%s
占位符只与
%
运算符一起使用,
{}
占位符只与
格式
方法一起使用,您不能混淆它们。(你的代码显然暗示了这一点,但我不能100%肯定新手会接受。)这是我的困惑,我编辑了代码,用现在的第二个实例“%s”替换
{}
,因为它本来就是这样的。我正在更改回以反映steveha在我编辑之前回答的事实。@steveha-谢谢:-)我不知道shutil.copy(),它确实让一切变得简单,所以我会继续。@steveha-而且我备份的文件目前在1到2.6mb之间,并且每年都在增长week@Darren:根据您的配置的大量不同内容,最佳块大小可以是2KB到8MB。一次复制一个2.6MB的文件就足够了。不过,让
shutil
为您找出困难的事情总比自己动手好,对吧?顺便说一句,这里真的没有理由使用类。一个没有方法、没有行为的类,除了它的
\uuuu init\uuuu
构造函数,就是一种混乱而冗长的函数编写方法。除非你真的对这个
first\u back\u
对象有一些用处,否则你还没有展示给我们吗?正如@steveha在他的回答中所显示的那样,如果Python中的代码看起来很复杂,那么你可能是做错了(尤其是作为一个新手)。在Python中使用最少的代码行是没有奖励的。一次读取整个文件将非常有效,除了非常大的文件。同时,对单个文件使用
rsync
不会比执行
cp
更复杂,为什么要让它更复杂呢?另外,为什么要使用
popen
而不是
子流程
?最后,Python的
shutil
函数与单独的命令行工具一样高效,而且从Python中使用起来更容易。我不知道您的文件有多大,它们的位置如何,等等。例如,如果源和目标位于不同的磁盘上,尤其是安装在网络上(备份时有意义)通过并行读写,可以加快速度。我怀疑
rsync
在这方面可能更好,但
cp
将是我提到的“类似的东西”。是,
子流程
shutil
更为优越;我只是很少使用它们,我忘记了!cp、rsync和Python的shutil都不会自动并行复制文件。我认为,如果你尝试这样做的话,网络驱动器速度慢的话,会对你造成伤害。并行化的一个有用方法是在更高级别同时运行两个拷贝。(在bash中,只需
cp src1 dst1&
cp src2 dst2&
并等待这两个作业;在Python中,使用
multiprocessing.Pool
concurrent.futures.ProcessPoolExecutor
并提交
shutil.copy
作业。)@阿巴内特:我仍然认为在阅读下一块的同时写上一块会加快速度;这通常是通过使用单独的写缓冲区和读缓冲区来实现的。这有点离题了