我有一个脚本可以从db(使用peewee)加载歌曲和每首歌曲的数据,然后下载每首歌曲。
for music in musiclibrary.select().where(musiclibrary.downloaded == 0):
if not os.path.exists("mp3s/" + music.category + "/" + music.artist_name):
os.makedirs("mp3s/" + music.category + "/" + music.artist_name)
if not os.path.exists("mp3s/" + music.category + "/" + music.artist_name +
"/" + music.album_name):
os.makedirs("mp3s/" + music.category + "/" + music.artist_name +
"/" + music.album_name)
sub_dir = ("mp3s/" + music.category + "/" + music.artist_name +
"/" + music.album_name)
song = requests.get(music.song_mp3_url, timeout=(3,9))
if song.status_code == 200:
try:
with open(os.path.join(sub_dir, song_name), "wb") as f:
for chunk in song.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
except Exception as e:
print "exp is", e
return
我正在
exp is [Errno 2] No such file or directory: u'mp3s/letmiat/\u0627\u0644\u0633\u064a\u062f \u062d\u0633\u064a\u0646 \u0627\u0644\u0645\u0627\u0644\u0643\u064a/\u0644\u0637\u0645\u064a\u0627\u062a \u0645\u062a\u0641\u0631\u0642\u0629 \\\u06357\u0644\u0645\u0627\u0644\u0643\u064a/\u0644\u0637\u0645\u064a7\u0644\u0645\u0627\u0644\u0643\u064a/\u0644\u0637\u0645\u064a\u0627\u062a.mp3
即使目录已存在,也会发生此错误。歌曲名称,专辑名称和艺术家姓名大多是阿拉伯语。我在Windows下运行它。
修改
我有一个脚本(run.py)在一些其他脚本(用scrapy编写)后调用此脚本(downloader.py)。 run.py位于项目根文件夹中,downloader.py是其下的一个级别。只是为了确定,我已将mp3s文件夹放在两个地方。这是它的外观
-project
--run.py
--mp3s
---downloader.py
---mp3s
答案 0 :(得分:1)
通过编写测试来验证它不是unicode问题:
def test_ascii_writing():
with open('test.txt', "w") as f:
f.write('TESTING')
def test_unicode_writing():
with open(u'\u0627.txt', "w") as f:
f.write('TESTING')
test_ascii_writing()
test_unicode_writing()
如果该测试通过,我猜你的问题就是假设类别/艺术家/专辑文件夹链已经存在,而不是。
如果您有一个名为mp3的文件夹并且它是空的,并且想要为该歌曲编写文件" Come Together"披头士乐队:
import os
os.mkdir('mp3/Rock')
os.mkdir('mp3/Rock/Beatles')
os.mkdir('mp3/Rock/Beatles/AbbeyRoad')
在你能做之前:
with open('mp3/Rock/Beatles/AbbeyRoad', "wb") as f:
for chunk in song.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
答案 1 :(得分:1)
如果我将错误中报告的名称拆分为“/”,我得到6个组件而不是5个,其中一个组件实际上是2,因为它包含“\”,即后跟反斜杠的空格。那是两个问题。显然嵌入式反斜杠是一个问题。此外,该对中的第一个组件以空格结束。当os.makedirs
创建目录时,Windows会剥离此空格字符。但是,Windows 不会从非最终路径组件中删除尾随空格,例如当您尝试创建mp3文件时。
您需要确保每个路径组件都有效,即它不包含保留字符 - 即ASCII控制字符(序号0-31),反斜杠,正斜杠,管道,冒号或通配符(问号,星号,小于,大于和双引号);不是DOS设备名称(CON,CONIN $,CONOUT $,PRN,AUX,NUL,COM [1-9]和LPT [1-9]);并且不以空格或句点(点)结束。