python 打开文件技巧_数字艺术家的Python文件管理技巧

python 打开文件技巧

阅读第1部分:使用Python自动执行数字艺术家的重复任务

如果您已经在相当长的时间内完成了数字艺术作品,那么对您而言,良好的文件管理的重要性应该显而易见。 如果您正在与其他歌手合作,那就更是如此。 每个人都有自己喜欢的命名约定和项目目录结构。 当您尝试查找应该以某种方式命名的文件时,可能会感到非常沮丧,但是您的一个合作伙伴认为,在“三只笨拙的双关”之后命名每个文件会更有趣。 (嘿,它发生了!)

一旦开始使用脚本来自动化流程的一部分,这种挫败感就会加剧。 现在,是您的代码(而不是您)找不到正确的文件。 更糟糕的是,这些脚本中的大多数都不会为稍微的命名更改寻找解决方法。 他们根本无法工作。

幸运的是,通过几行相对简单的代码,您可以帮助缓解此类问题。 让我们以一个不是由自娱自乐的合作者引起的例子作为例子。 有时问题可能是您自己的错。 我个人从来没有( 啊哈 )犯错误。 但是有时候,我使用的程序完全按照我告诉他们的内容执行,而不是按照我的意图执行。

案例

动画是我所做工作的重要组成部分。 创建动画或视觉效果时,将动画作品的每一帧作为单独的图像文件输出( 渲染 )是一种好习惯。 (有时您每帧渲染多个图像,但让我简化一下。)通常,这些动画帧都放在硬盘驱动器上自己的目录中。

现在,我不确定这是否发生在其他任何人身上,或者只是我的一个怪癖,但有时(在多个软件包中)我已经选择了渲染文件应存放的目录,但是然后有一个小故障。 (有些人可能会说“用户错误”,但请记住,我从来不会犯错误。)与其将渲染保存到project/render/ ,不如保留最后一个斜线,并且每个渲染图像文件均以“ render”一词开头,而不是进入render目录。 也就是说,我希望动画的第1帧是project/render/frame0001.png ,但是程序会创建project/renderframe0001.png 。 现在,我的主项目目录充满了成千上万个渲染文件。 毛。

我有几种选择。 一种简单的解决方案是将所有这些渲染文件移动到正确的目录中,并简单地容忍命名错误。 但是,如果我的后期制作步骤期望使用每个文件名开头都没有该渲染词的命名结构,则可能会出现问题。 如果我需要重新渲染,它可能会变得更加复杂。

说到重新渲染,这可能是另一种选择。 我可以删除命名不正确的文件,在动画程序中修复输出路径,然后重做所有渲染。 但是,那里的问题是渲染动画帧有时会非常耗时。 对于复杂的场景,一帧可能要花费一个多小时。 将其乘以动画的每秒24-30帧,我们可以很快看到重新渲染不是我们希望的快速简便的解决方案。

当然,总是有手动选项:将所有渲染文件移动到正确的目录,然后遍历并更改每个文件的名称。 当然,如果您只有几打帧,可能就不会这么麻烦了。 如果您有成千上万的动画帧,那就麻烦了。

Python脚本解决方案

那还剩下什么呢? 没错:编写脚本! 与本系列的第1部分一样 ,我们将在Python中进行此操作。 在第1部分中,我们使用了subprocess模块。 这个示例不需要这样做,但是它确实使用了Python的另一个内置模块osos模块提供了一种由操作系统处理的任务(例如,移动和重命名文件)的方法。 而且由于Python是多平台的,因此无论您使用的是哪种实际操作系统, os模块都可以在Python的任何地方工作。

因此,脚本的快速而肮脏的版本可能如下所示:



   
   
import os
   
for filename in os . listdir ( './' ) :
    if filename. startswith ( 'renderframe' ) :
        os . rename ( filename , filename [ : 6 ] + '/' +filename [ 6 : ] )

如果您以前从未编码过,那么此脚本有一些您可能不熟悉的东西。 让我们从您所知道的开始。 第一行import os ,使您的脚本了解Python的内置os模块(类似于上一篇文章中导入subprocess的方式)。

下一行代码(尽管有额外的换行符)指示循环的开始。 循环是脚本和编程中的主要节省时间之一。 基本上,如果您需要一遍又一遍地执行某个过程(例如重命名一堆文件),那么循环就可以节省一天(和您的理智)。

在这个特定的示例中,您将使用for循环,这是一种用于迭代一系列事情的特殊循环。 在这种情况下,您要遍历当前目录中所有文件的名称。 你是如何做呢 让我向您介绍os.listdir

Python os模块具有一个名为listdir的函数。 该函数将任何目录路径作为输入,并向您返回该目录中所有文件的列表。 在此示例中,您正在使用os.listdir('./')'./'位是一串文本(因此带有引号),是“我当前所在的当前目录”的简写。

“好极了,”您可能会说,“所以os.listdir('./')列出了当前目录中的所有文件,但是与for循环有什么关系呢?”

好问题! 您不想一次处理整个文件列表。 您需要一次解决一个问题。 for循环遍历os.listdir('./')提供的文件列表。 因为您的for循环需要通用名称才能在处理每个文件时调用它,所以我们使用变量filename作为替代。

知道这一点后,请for filename in os.listdir('./'):设置for循环的完整行: for filename in os.listdir('./'): 。 这行的英文翻译是:“列出当前目录中的每个文件。然后遍历文件名列表。为简单起见,只需在处理每个文件filename时调用它即可。”

在脚本的下一行代码中,您处于循环中(您可以知道,因为该行是缩进的)。 因为您处于循环状态,所以您在当前目录中的每个文件都会重复执行此处的所有操作。 请记住,我们之所以开始这样做是因为渲染的文件最终放置在错误的位置-可能这里还有其他文件不是渲染帧。 我们需要确保该脚本不会重命名和移动任何文件。 它需要将自身限制为仅那些渲染的帧。

筛选和重命名

幸运的是,我们有一个很好的方法。 我们可以根据我告诉动画软件制作的可怕的错误命名进行过滤。 当前目录中所有放置不佳,命名不正确的文件都以renderframe开头

对于脚本循环通过的每个文件,它需要检查并查看该文件是否以renderframe开头 。 这正是这行代码的作用: if filename.startswith('renderframe'): 这行代码在脚本和编程中使用了另一种常见的构造, if语句或conditional 。 它以单词if开头,然后是测试条件。 该测试条件必须为true或false。 如果测试条件为true,则脚本可以执行if语句规定的特定代码段。 如果测试条件为假,那么将跳过该部分代码。

在此示例中,测试条件使用Python中所有字符串内置的startswith函数。 顾名思义,如果字符串以您输入的任意文本开头,则startswith函数将返回true。 否则,它返回false。 因此, if filename.startswith('renderframe'):为英语,它将显示为:“如果文件名列表中的当前文件名以文本'renderframe'开头,则执行下一段代码。 ”

好的。 您在当前目录中有了文件列表,并且已将列表缩小到仅放错位置的渲染文件。 现在进行重命名并将这些文件移动到应有位置的实际工作。 幸运的是,使用os模块的rename功能,可以在一行代码中完成此重命名和移动步骤。

os.rename函数采用两个输入参数:要重命名的文件和要将其重命名的文件。 不过,最酷的部分是,这些输入参数将文件的路径视为其名称的一部分。 因此,如果在第二个输入中包含不同的路径,则可以一次重命名和移动文件。 万岁少打字!

现在,看第二行文本( os.rename(filename, filename[:6]+'/'+filename[6:]) ),上半部分非常简单。 下半部分(逗号后面)是您以前可能没有遇到过的一些时髦现象。 不过,打开包装并不难。 只是了解您想做什么。

假设您的脚本已启动,并且正在文件renderframe0001.png 。 要重命名和移动文件,您只需在单词render后面添加一个/字符。 这个词render六个字母长。 有了这些小知识,您就可以使用filename变量中已有的内容为文件构造新路径。 您只需要正确的符号即可。

我一直喜欢Python的符号来获取文本字符串的子集。 它是[start:end] ,其中start是子集中的第一个字符, end是子集中的最后一个字符之后的字符。 就像每种理智的编程语言一样,Python从零开始计数。 因此,在我们的示例中,我们使用的filename变量具有文本renderframe0001.png ,您可以使用filename[3:7]而Python会将derf作为结果。

您可能会注意到,您的代码不仅使用了这种表示法两次,而且在每种情况下,都缺少了起始字符或结束字符的值。 这是一个很酷的便利小技巧。 如果您仅提供一个起始字符,但将冒号保持在符号内,则Python会假定您希望字符串之后的每个字符。 同样,如果仅包含结束字符值,Python将为您提供字符串中之前的所有字符。 在我们的示例中, filename[:6]可以renderrenderfilename[6:]表示法可以使您获得frame0001.png

使用此技术,您可以在render一词后将文件名分成两半。 现在,您所需要做的就是用另一个斜杠( / )重新组装它。 因此,将它们放在一起,这一行代码( os.rename(filename, filename[:6]+'/'+filename[6:]) )翻译为:“通过在第六个字符后插入斜杠来重命名我的文件文件名中的字符。”

添加用户反馈

就是为了描述您快速而又肮脏的脚本来移动和重命名一大堆放错了位置的文件。 唯一值得添加的一点就是用户反馈。 如果要移动和重命名数千个文件,则可能需要一分钟左右的时间。 了解脚本正在处理的文件将很有用。 您可以在重命名之前使用一些打印语句来完成此操作。 完成的脚本可能如下所示:



   
   
import os
   
for filename in os . listdir ( './' ) :
    if filename. startswith ( 'renderframe' ) :
        print ( 'Moving and renaming:' , filename )
        os . rename ( filename , filename [ : 6 ] + '/' +filename [ 6 : ] )

然后你去! 如果像我一样,如果您的软件错误地按照您的要求进行操作,那么这几行代码可以为您节省大量时间。

此代码块也为其他有用的文件管理脚本提供了一个很好的起点。 例如,我喜欢

此脚本与上一个脚本之间的差异很小。 该脚本无需处理文件名的开头,而是从文件末尾开始工作。 因此,此脚本而不是filename.startswith ,而是使用filename.endswith作为其过滤机制。 而且,此脚本0001.png在第六个字符之后插入斜杠,而是修改了0001.png之前的字符(即,每个字符直到末尾的第八个字符)。 注意filename[:-8]的负数。 这个负值告诉Python从字符串的结尾而不是开头开始。

然后你去! 现在,您可以立即更改一堆文件的开头或结尾(或中间!)。 您可以节省时间,避免执行无聊的重复性任务,因此您可以将精力集中在做更多有趣的创意工作上。

翻译自: https://opensource.com/life/16/10/python-file-management-tricks-digital-artists

python 打开文件技巧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值