即使它存在,也不会获得此类文件或目录

时间:2017-09-22 00:31:56

标签: python windows

我有一个脚本可以从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

2 个答案:

答案 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]);并且不以空格或句点(点)结束。