python - os.rename 说无法访问该文件,因为它正在被另一个进程使用
问题描述
我正在研究一个有用的脚本,用于根据使用audio_metadata
库的歌曲标签重命名 mp3 文件。
我已经尝试过os.rename
使用os.system('ren "FILENAME" "NEWNAME"')
.
我的代码:
import os
import audio_metadata
for x in range(len(songs)):
song = songs[x]
metadata = audio_metadata.load('%s' % song)
titlel = metadata['tags'].title
artistl = metadata['tags'].artist
title = titlel[0].strip()
artist = artistl[0].strip()
newname = '%s - %s.mp3' % (title, artist)
print("[*] %s => %s" % (song, newname))
os.rename(song, newname)
我预计:
your love.mp3 => Your Love-The Outfield.mp3
但我明白了:
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process:
'your love.mp3' -> "Your Love-The Outfield.mp3"
解决方案
调用时读取后是否有可能audio_metadata
未正确关闭文件对象metadata = audio_metadata.load('%s' % song)
?我快速浏览了一下 audio_metadata 源,看起来您可以传递文件对象而不是文件路径字符串。
尝试以这种方式获取元数据:
with open('%s' % song, 'rb') as f:
metadata = audio_metadata.load(f)
推荐阅读
- typescript - 为 Visual Studio 代码中的每个链接语句添加换行符
- bit-manipulation - 如何重新解释整数的指数 (2^31, ..., 2^0)?
- amazon-web-services - AWS Lightsail 将我的 html 包装在框架集中
- php - 为什么 PHP CLI 被认为是一种 SAPI?
- javascript - Three.js - 如何为整个场景创建镜像
- java - JavaFX:如何获得像素的颜色和 alpha 透明度?
- javascript - Vanilla Javascript ES6 相当于 jQuery toggle()?
- javascript - 如何将带有 getter/setter 的 TypeScript 类实例转换为 JSON 以存储在 MySQL 数据库中
- python - RuntimeError:线程 'Thread-7' 中没有当前事件循环。使用不和谐.py
- vue.js - 在 Vue 中使用自定义模型对象作为 v-for 的提供者?