web-dev-qa-db-ja.com

Pythonでパスから拡張子なしのファイル名を取得する方法?

Pythonでパスから拡張子なしのファイル名を取得する方法?

747
Joan Venge

拡張子なしでファイルの名前を取得する:

import os
print(os.path.splitext("path_to_file")[0])
1031
Geo

それを転がすだけです:

>>> import os
>>> base=os.path.basename('/root/dir/sub/file.ext')
>>> base
'file.ext'
>>> os.path.splitext(base)
('file', '.ext')
>>> os.path.splitext(base)[0]
'file'
381
gimel
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
182
hemanth.hm

Python 3.4以降でPathlibを使用した、読みやすいバージョン

from pathlib import Path

Path('/root/dir/sub/file.ext').stem

印刷します。

ファイル

パスが シンボリックリンク になる場合は、resolve()を追加します。

Path('/root/dir/sub/file.ext').resolve().stem
88
bold

完全を期すために、Python 3.2+用のpathlibソリューションを紹介します。

from pathlib import Path

print(Path(your_path).resolve().stem)
39
Morgoth

ファイルへのパスをそのままにして、拡張子を削除するだけの場合

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2
22
user2902201

拡張子に複数のドットがある場合はos.path.splitext()しないが機能します。

例えば、images.tar.gzです。

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar

ベース名の最初のドットのインデックスを見つけて、ベース名をスライスして拡張子なしのファイル名だけを得ることができます。

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images
19

https://docs.python.org/3/library/os.path.html

In python 3 pathlib "pathlibモジュールは高レベルのパスオブジェクトを提供します。"そう、

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c
16
jjisnow

しかし、osをインポートしても、path.basenameと呼ぶことはできません。 basenameとして直接呼び出すことは可能ですか?

import osを使用してからos.path.basenameを使用

importing osは、osを参照せずにos.fooを使用できるという意味ではありません。

12

@ IceAdor'sは@ user2902201の解決策に対するコメントの中のrsplitを参照しています。 rsplitは、複数期間をサポートする最も簡単なソリューションです。

ここでは詳しく説明します。

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

私の報告書

11
dlink

私は配列インデックスを使う必要なしに os.path.splitext を使うことへの変化を投げるだろうと思った。

この関数は常に(root, ext)ペアを返すので、安全に使用できます。

root, ext = os.path.splitext(path)

例:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
9
ScottMcC

import os

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv

これはfilenamename__を除いてextensionname__を返します(C:\ Users\Public\Videos\Sample Videos\wildlife)

temp = os.path.splitext(filename)[0]  

これで、一時ファイルからfilenamename__だけを取得できます。

os.path.basename(temp)   #this returns just the filename (wildlife)
4
learncode

複数の内線を意識した手順strおよびunicodeパスに対して機能します。 Python 2と3で動作します。

import os

def file_base_name(file_name):
    if '.' in file_name:
        separator_index = file_name.index('.')
        base_name = file_name[:separator_index]
        return base_name
    else:
        return file_name

def path_base_name(path):
    file_name = os.path.basename(path)
    return file_base_name(file_name)

動作:

>>> path_base_name('file')
'file'
>>> path_base_name(u'file')
u'file'
>>> path_base_name('file.txt')
'file'
>>> path_base_name(u'file.txt')
u'file'
>>> path_base_name('file.tar.gz')
'file'
>>> path_base_name('file.a.b.c.d.e.f.g')
'file'
>>> path_base_name('relative/path/file.ext')
'file'
>>> path_base_name('/absolute/path/file.ext')
'file'
>>> path_base_name('Relative\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('C:\\Absolute\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('/path with spaces/file.ext')
'file'
>>> path_base_name('C:\\Windows Path With Spaces\\file.txt')
'file'
>>> path_base_name('some/path/file name with spaces.tar.gz.Zip.rar.7z')
'file name with spaces'
4
Lycan

他の方法では、複数の拡張機能は削除されません。また、拡張子のないファイル名に問題がある場合もあります。このスニペットは両方のインスタンスを処理し、Python 2と3の両方で動作します。パスからベース名を取得し、ドットで値を分割し、ファイル名の最初の部分である最初の値を返します。

import os

def get_filename_without_extension(file_path):
    file_basename = os.path.basename(file_path)
    filename_without_extension = file_basename.split('.')[0]
    return filename_without_extension

実行するサンプルのセットは次のとおりです。

example_paths = [
    "FileName", 
    "./FileName",
    "../../FileName",
    "FileName.txt", 
    "./FileName.txt.Zip.asc",
    "/path/to/some/FileName",
    "/path/to/some/FileName.txt",
    "/path/to/some/FileName.txt.Zip.asc"
]

for example_path in example_paths:
    print(get_filename_without_extension(example_path))

どの場合でも、出力される値は次のとおりです。

FileName
3
Alan W. Smith

Windowsシステムでは、以下のようにdrivernameプレフィックスも使用しました。

>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

だから私はドライブ文字やディレクトリ名を必要としないので、私は使用します:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi
2
Zéiksz
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
2
user4949344

これを解決する最も簡単な方法は

import ntpath 
print('Base name is ',ntpath.basename('/path/to/the/file/'))

これにより、時間と計算コストを節約できます。

1
joseph nkoro

最大の難解な場合:

def strip_suffix(filename):
    """
    >>> video.mp4
    video

    >>> video.extra.mp4
    video.extra
    """
    return ''.join((name_dot[0] + name_dot[1] for name_dot in itertools.Zip_longest(filename.split('.')[0:-1], '.', fillvalue='.')))[0:-1]

注:これはただの楽しみのためです。これを使わないでください。代わりにos.path.splitextを使用してください

1
Connor
import os
list = []
def getFileName( path ):
for file in os.listdir(path):
    #print file
    try:
        base=os.path.basename(file)
        splitbase=os.path.splitext(base)
        ext = os.path.splitext(base)[1]
        if(ext):
            list.append(base)
        else:
            newpath = path+"/"+file
            #print path
            getFileName(newpath)
    except:
        pass
return list

getFileName("/home/weexcel-Java3/Desktop/backup")
print list
1
shivendra singh

ここで見られるように( https://stackoverflow.com/a/424006/1250044 )、簡単なsplit/popマジックを使ってファイル名を抽出することができます(ウィンドウとPOSIXの違いを考慮して)。

def getFileNameWithoutExtension(path):
  return path.split('\\').pop().split('/').pop().rsplit('.', 1)[0]

getFileNameWithoutExtension('/path/to/file-0.0.1.ext')
# => file-0.0.1

getFileNameWithoutExtension('\\path\\to\\file-0.0.1.ext')
# => file-0.0.1
1
yckart

便宜上、 os.path の2つのメソッドをラップする単純な関数です。

def filename(path):
  """Return file name without extension from path.

  See https://docs.python.org/3/library/os.path.html
  """
  import os.path
  b = os.path.split(path)[1]  # path, *filename*
  f = os.path.splitext(b)[0]  # *file*, ext
  #print(path, b, f)
  return f

Python 3.5でテスト済み。

0
handle