由于文件名中的"/"而导致 Python 文件写入错误



我有一个类似的代码块

for track in (results['tracks']):
track_id_chunk.append(track['uri'])
print (str(z) + " - " + track['name'])
try:
r = requests.get(track['preview_url'], allow_redirects=True)
open('dataset/'+genres[x]+"/"+str(track['name'])+'.mp3', 'wb').write(r.content)
except requests.exceptions.RequestException as e:
print ("---------------------- Couldnt get "+artists[j]+"  -  "+track['name'] + " !!!")
continue
z+=1

它使用spotify API下载30秒的艺术家样本。

问题是,当一首歌的名字中有一个"/"时(例如"War Pigs/Luke’s Wall-2014 Remaster"(,文件操作会查找"/"之前的目录,但找不到,并抛出错误:

FileNotFoundError: [Errno 2] No such file or directory: "dataset/metal/War Pigs / Luke's Wall - 2014 Remaster.mp3"

这个问题的最佳解决方法是什么?

如果您在Linux上,文件名中不能有斜杠。我的建议是用其他类似"-"的东西来代替这个字符:

str(track['name']).replace('/', '-')

您可以使用下面定义的slugify函数,

slugify(value)

代码:

def slugify(value):
"""
converts to lowercase, removes non-alpha characters,
and converts spaces to hyphens.
"""
value = re.sub(r'[^ws-]', '', value).strip().lower()
value = re.sub(r'[-s]+', '-', value)
return value

通过以下方式将字符串转换为正确的文件名:

  • 删除非字母数字、下划线、连字符的字符,或空白
  • 正在删除前导和尾部空白
  • 正在转换为小写
  • 用单短划线替换任何空白或重复的短划线

用法:

>>> slugify('War Pigs / Luke's Wall - 2014 Remaster')

输出:

war-pigs-lukes-wall-2014-remaster

最新更新