【问题标题】:OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: [Python]OSError:[WinError 123] 文件名、目录名或卷标语法不正确:[Python]
【发布时间】:2020-06-07 16:43:25
【问题描述】:

我想重命名一个 mp3 文件。

   os.rename(f'C:\\Users\\axeld\\Desktop\\Music\\NG  Trial\\{item}',
             f'C:\\Users\\axeld\\Desktop\\Music\\NG  Trial\\{Song_name}')

但我收到此错误:

OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\\Users\\axeld\\Desktop\\Music\\NG  Trial\\109650.mp3' -> 'C:\\Users\\axeld\\Desktop\\Music\\NG  Trial\\Operation: Evolution.mp3'

我 100% 确定文件存在,为什么会出现此错误?

【问题讨论】:

  • 尝试使用/ 而不是\\

标签: python file mp3


【解决方案1】:

我没有 Windows 机器可以尝试这个,但您是否考虑过使用 os.path.join 创建路径?

basedir = os.path.join('C:/', 'Users', 'axeld', 'Desktop', 'Music', 'NG  Trial')
old_name = os.path.join(basedir, item)
new_name = os.path.join(basedir, song_name)
os.rename(old_name, new_name)

来自documentation of os.path.join:

智能地加入一个或多个路径组件。返回值是 path 和 *paths 的任何成员的串联,除了最后一个部分之外的每个非空部分之后只有一个目录分隔符 (os.sep),这意味着如果最后一部分为空,则结果只会以分隔符结尾.如果一个组件是绝对路径,则所有之前的组件都被丢弃,并从绝对路径组件继续连接。

在 Windows 上,当遇到绝对路径组件(例如 r'\foo')时,不会重置驱动器号。如果组件包含驱动器号,则所有以前的组件都将被丢弃并重置驱动器号。请注意,由于每个驱动器都有一个当前目录,因此 os.path.join("c:", "foo") 表示相对于驱动器 C: (c:foo) 上的当前目录的路径,而不是 c:\foo .

注意最后一行,它记录了 Windows 上的一个特殊情况(另请参见 answer on SO:这就是为什么在我上面的代码中 C: 之后有正斜杠。

替代解决方案

基于 cmets,os.path.join 解决方案仍会产生错误。 作为一种解决方法,您可以使用原始字符串:

os.rename(
    r'C:\Users\axeld\Desktop\Music\NG Trial\{}'.format(item), 
    r'C:\Users\axeld\Desktop\Music\NG Trial\{}'.format(song_name))

【讨论】:

  • 有趣...冒着说明显而易见的风险,NG 和 Trial 之间真的有两个空格吗?您还介意尝试使用原始字符串吗?像这样:os.rename(r'C:\Users\axeld\Desktop\Music\NG Trial\{}'.format(item), r'C:\Users\axeld\Desktop\Music\NG Trial\{}'.format(Song_name))
  • 我试过了,现在我得到了这个错误:FileNotFoundError: [WinError 3] The system cannot find the path specified: 'C:\\Users\\axeld\\Desktop\\Music\\NGCopy\\183725.mp3' -> 'C:\\Users\\axeld\\Desktop\\Music\\NGCopy\\"\\\\Rock the House".mp3'
  • 尽管我倾向于认为错误与原始文件有关,但新文件名中有一些可疑的双引号和反斜杠。为简单起见,您可以尝试将183725.mp3 重命名为183725_test 之类的名称(即使用item 和item + '_test')吗?
  • (忽略上面的评论)它工作。现在我正在尝试更改文件标签,但出现此错误:`audio.tag.artist = Author_name AttributeError: 'NoneType' object has no attribute 'artist'
  • 酷,我会更新我的答案,希望它也能帮助其他人。至于另一个错误,看起来audio.tag 对象没有任何名为artist 的属性 - 但这是一个不同的问题,我们可能会跑题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2021-01-07
  • 1970-01-01
  • 2021-04-11
  • 2020-04-08
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多