36

/ Users / smcho / Desktop /bracket / [10,20]ディレクトリに「abc.txt」がありますが、このPythonコードを実行すると

import glob
import os.path

path1 = "/Users/smcho/Desktop/bracket/\[10,20\]"
pathName = os.path.join(path1, "*.txt")
print glob.glob(pathName)

空のリストを返します。

  • Pythonのグロブは角かっこ文字などを処理できませんか?
  • この問題を解決する方法はありますか?
4

4 に答える 4

34

の角かっこはglob文字クラスに使用されます(たとえば、[a-z]小文字に一致します)。各角かっこを文字クラスに入れて、それらを強制的に一致させることができます。

path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"

[[]は文字のみを含む文字クラス[であり、[]]は文字のみを含む文字クラスです](閉じ括弧は、最初の位置に置くことで文字クラスに配置できます)。

さらに、角かっこは文字列リテラルでエスケープされないため、コードは角かっこと同様に円記号を探します。

于 2010-04-07T19:08:06.347 に答える
17

Python 3.4では、を使用できますglob.escape

于 2014-06-01T11:04:01.207 に答える
7

globfnmatchボンネットの下で使用します。あなたはそれを直接使うことができます:

import fnmatch, os

names = os.listdir("/Users/smcho/Desktop/bracket/[10,20]")
print fnmatch.filter(names, '*.txt')

または(非公開)を使用します(glob.glob1()少なくともPython3を含むPython2.3以降に存在します):

import glob

print glob.glob1("/Users/smcho/Desktop/bracket/[10,20]", '*.txt')

の実装は次のglob.glob1とおりです。

def glob1(dirname, pattern):
    if not dirname:
        dirname = os.curdir
    if isinstance(pattern, unicode) and not isinstance(dirname, unicode):
        dirname = unicode(dirname, sys.getfilesystemencoding() or
                                   sys.getdefaultencoding())
    try:
        names = os.listdir(dirname)
    except os.error:
        return []
    if pattern[0] != '.':
        names = filter(lambda x: x[0] != '.', names)
    return fnmatch.filter(names, pattern)
于 2010-04-07T19:15:25.540 に答える
5

path.replace('[', '[[]')任意の入力パスをglob正しく処理するために使用できます。

于 2012-08-16T13:28:31.197 に答える