12

次のようなリストにファイルの完全なパスがあります。

a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']

私が望むのは、次のように、拡張子なしでファイル NAMES だけを取得することです。

b = ['datafile', 'datafile2', 'datafile3']

私が試したことは次のとおりです。

xfn = re.compile(r'(\.xls)+')
for name in a:
    fp, fb = os.path.split(fp)
    ofn = xfn.sub('', name)
    b.append(ofn)

しかし、結果は次のとおりです。

b = ['datafilex', 'datafile2', 'datafile3x']
4

4 に答える 4

27
  1. 使用した正規表現が間違っています。、など(\.xls)+の形式の文字列に一致します。これが、項目に が残っている理由です。必要なのは、つまり a の後に 0 個以上の任意の文字が続くことです。.xls.xls.xlsx.xlsx\.xls.*.xls

  2. 正規表現を使用する必要はありません。これを処理する os.path には、 basenamesplitextという特殊なメソッドがあります

    >>> import os.path
    >>> os.path.basename('home/robert/Documents/Workspace/datafile.xlsx')
    'datafile.xlsx'
    >>> os.path.splitext(os.path.basename('home/robert/Documents/Workspace/datafile.xlsx'))[0]
    'datafile'
    

    .xlsしたがって、 /サフィックスをあまり気にしないと仮定すると.xlsx、コードは次のように単純になります。

    >>> a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']
    >>> [os.path.splitext(os.path.basename(fn))[0] for fn in a]
    ['datafile', 'datafile2', 'datafile3']
    

    (リスト内包表記にも注意してください。)

于 2013-04-06T10:06:55.070 に答える
4

一発ギャグ:

>>> filename = 'file.ext'
>>> '.'.join(filename.split('.')[:-1]) if '.' in filename else filename
'file'
于 2013-04-06T10:10:17.123 に答える
0

splitメソッドを使用しないのはなぜですか?

def get_filename(path):
    """ Gets a filename (without extension) from a provided path """

    filename = path.split('/')[-1].split('.')[0]
    return filename


>>> path = '/home/robert/Documents/Workspace/datafile.xlsx'
>>> filename = get_filename(path)
>>> filename
'datafile'
于 2013-04-06T10:10:50.723 に答える