Python 忽略具有特定文件类型的文件夹

Python 忽略具有特定文件类型的文件夹,python,powershell,Python,Powershell,我试图为Python重写我在这里找到的旧Powershell脚本,但徒劳无功。我没有Python方面的经验或知识,我的“脚本”一团糟,但大部分都能工作。唯一缺少的是,我希望能够忽略不包含“MP3”或我指定的任何文件类型的文件夹。以下是我到目前为止得到的- import os, os.path, fnmatch path = raw_input("Path : ") for filename in os.listdir(path): if os.path.isdir(filename):

我试图为Python重写我在这里找到的旧Powershell脚本,但徒劳无功。我没有Python方面的经验或知识,我的“脚本”一团糟,但大部分都能工作。唯一缺少的是,我希望能够忽略不包含“MP3”或我指定的任何文件类型的文件夹。以下是我到目前为止得到的-

import os, os.path, fnmatch

path = raw_input("Path :  ")

for filename in os.listdir(path):
if os.path.isdir(filename):
    os.chdir(filename)
    j = os.path.abspath(os.getcwd())
    mp3s = fnmatch.filter(os.listdir(j), '*.mp3')
    if mp3s:
        target = open("pls.m3u", 'w')
        for filename in mp3s:
            target.write(filename)
            target.write("\n")
    os.chdir(path)
我想做的就是(如果可能的话)当脚本在文件夹中循环时,忽略那些不包含“MP3”的文件夹,并删除“pls.m3u”。只有在默认情况下创建“pls.m3u”,我才能使脚本正常工作。问题是,这会在仅包含.jpg文件的文件夹中创建大量空的“pls.m3u”文件。你明白了


我确信这个脚本对Python用户来说是亵渎神明的,但是任何帮助都将不胜感激。

我认为您可以通过两级方法来完成。首先,将顶层目录复制到另一个目录,忽略不包含MP3文件的目录

import shutil
IGNORE_PATTERNS = ('*mp3s')
shutil.copytree(SOURCE_DIR, TARGET_DIR, ignore=shutil.ignore_patterns(IGNORE_PATTERNS))

然后继续使用示例代码中的文件处理方法。请注意,shutil.copytree只有python2.5中的ignore_模式,如果我理解正确,您的核心问题是该脚本创建了大量空的pls.m3u文件。这是因为在您检查是否有任何要编写的内容之前,您正在调用
open

一个简单的解决方法是改变这一点:

target = open("pls.m3u", 'w')
j = os.path.abspath(os.getcwd())
for filename in os.listdir(j):
    (title, extn) = os.path.splitext(filename)
    if extn == ".mp3":
        target.write(filename)
        target.write("\n")
为此:

target = None
j = os.path.abspath(os.getcwd())
for filename in os.listdir(j):
    (title, extn) = os.path.splitext(filename)
    if extn == ".mp3":
        if not target:
            target = open("pls.m3u", 'w')
        target.write(filename)
        target.write("\n")
if target:
    target.write("\n")
    target.write("\n")
也就是说,只有在我们决定需要写入文件时才打开该文件

一种更具python风格的方法可能是这样做:

j = os.path.abspath(os.getcwd())
mp3s = [filename for filename in os.listdir(j)
        if os.path.splitext(filename)[1] == ".mp3"]
if mp3s:
    target = open("pls.m3u", 'w')
    for filename in mp3s:
        target.write(filename)
        target.write("\n")
    target.write("\n")
    target.write("\n")

也就是说,首先在内存中创建一个MP3列表(在这里使用列表理解,尽管您可以对循环使用一个普通的
,如果您更熟悉的话,还可以使用
追加
),然后仅当生成的列表非空时才打开文件。(如果列表不是空的,则列表是真实的)

非常有用:
mp3s=fnmatch.filter(os.listdir(folder),'*.mp3')
@THC4k我试图进行尽可能的“文字”更改,但我同意这看起来是使用fnmatch而不是
os.path.splitext的好地方。(不得不使用下标尤其令人不满意。)我编辑了我的原始帖子,以反映我所做的更改。我不完全理解你的第一个例子,但我可以“看到”你的第二个例子是如何工作的,所以我用它来代替。遗憾的是,我一直收到有关行“==”.mp3“]”的语法错误,因此我在fnmatch建议中替代了它,现在它工作得很好。谢谢你们两位的帮助,非常感谢@gavin19对于语法错误表示抱歉。这是由于我的一个错误。我忘记了列表中的“文件名”部分。第一个示例与您的原始代码类似,只是它不总是打开文件,而是在第一次遇到mp3文件时才打开文件
target
是输出文件,最初设置为
None
(这是“falsy”,意味着在布尔上下文中它将充当false,就像if条件一样)。当我们遇到mp3时,我们会检查文件是否已经打开。如果没有,我们就打开它。文件对象(以及大多数其他对象)在Python中是“真实的”。