【问题标题】:python script to slice filenames to certain lengthpython脚本将文件名切片到一定长度
【发布时间】:2021-03-21 21:26:07
【问题描述】:

我是 python 语言的新手,正在尝试编写一个脚本,可以将文件名的最后一个字符切成特定的长度。 它有效,但由于某种原因,它拒绝继续,并且循环意外中断,给出文件不存在的错误消息。 错误消息:“FileNotFoundError:[WinError 2] 系统找不到指定的文件:” 这是我的脚本,请告诉我有什么问题!!!

import os
#define a function to trim latest characters to a specefic length"""
def renamer(folderpath, newlength):
    while True:
        for filename in os.listdir(folderpath):
            root = os.path.splitext(filename)[0]
            exten = os.path.splitext(filename)[1]
            while len(root) >= newlength:
                os.rename(folderpath + '\\' + root + exten, folderpath + '\\' + root[:-1] + exten)
            continue
        if len(root) <= newlength:
            break

【问题讨论】:

  • 您收到了什么错误信息?也可以使用os.path.join() 来连接路径,而不是使用字符串添加。
  • 错误信息:FileNotFoundError: [WinError 2] 系统找不到指定的文件:
  • 请编辑问题并包含相关错误信息

标签: python-3.x


【解决方案1】:

我不喜欢你做任务的方式,但为了解决你的问题,我在说明你正在做的错误。

您将文件从 root='Name' 更改为 root='Nam',但没有更新 root 的值。所以下次循环运行时,它会再次查找一个显然不存在的文件“name”,因为您将它重命名为“nam”。

所以也更新 root 的值,你会很高兴的。

但我还是要提一下,你应该用其他方式解决它。

【讨论】:

  • 如何使循环更新“root”的值?谢谢
  • os.rename() 调用后,只需执行 root = root[:-1]
  • 太棒了,它成功了,非常感谢。如果您有更好的解决方案,请分享一下
【解决方案2】:

这里有两个问题:

  • 最好使用os.path.join 连接文件夹和文件名,这样它就可以在所有系统上运行而无需更改代码(例如 - *nix 操作系统使用/ 而不是\作为分隔符),而不是直接连接\\
  • 就像@Illrnr 所说,问题是在第一次重命名后(例如abcdefgh.pngabcdefg.png),代码将继续寻找旧文件名(abcdefgh.png),这会引发错误。李>
  • 使用 while 循环每次缩短一个字符会使您的逻辑复杂化,并且由于对rename 的多次调用会大大增加代码的运行时间 - 您可以将其缩短为所需的长度没有所有这些循环和跟踪长度等......

试试这个,看看你是否理解代码:

import os

def renamer(folderpath, newlength):
    for filename in os.listdir(folderpath):
        root, exten = os.path.splitext(filename)
        if len(root)>newlength:
            oldname = os.path.join(folderpath, root+exten)
            newname = os.path.join(folderpath, root[:newlength]+exten)
            os.rename(oldname, newname)
            print(f"Shortened {oldname} to {newname}")

【讨论】:

  • 是的,非常好,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2016-08-09
  • 2015-05-12
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多