Pythonのパスから拡張子なしのファイル名を取得するにはどうすればよいですか?


回答:


1316

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

import os
print(os.path.splitext("/path/to/some/file.txt")[0])

プリント:

/path/to/some/file

のドキュメントos.path.splitext

重要な注意:ファイル名に複数のドットがある場合、最後のドットの後の拡張子のみが削除されます。例えば:

import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])

プリント:

/path/to/some/file.txt.zip

そのケースを処理する必要がある場合は、以下の他の回答を参照してください。


13
これが十分に一般的な操作である場合、おそらくそれが独自の公式コマンドであることに値するでしょうか?os.path.splitext(os.path.basename(path_to_file))の代わりにos.path.filename(path_to_file)のようなもの[0]
Fnord

19
ファイル名に複数のドットが含まれている場合はどうなりますか?
matteok 2014

101
matteokと同じことを考えている人にとって、複数のドットがある場合、splitextは最後のドットで分割します(したがってsplitext('kitty.jpg.zip')を与えます('kitty.jpg', '.zip'))。
チャックは、

50
このコードは、ファイルだけでなく、完全なファイルパス(拡張子なし)を返すことに注意してください。
2018

2
ええ、そうする必要がありますsplitext(basename('/some/path/to/file.txt'))[0](私はいつもそうしているようです)
CpILL

531

あなたはあなた自身で作ることができます:

>>> 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'

重要な注意:.ファイル名に複数ある場合、最後のファイルのみが削除されます。例えば:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

これに対処する他の回答については、以下を参照してください。


2
@ScottWilson:インポートする必要がありosます。
LarsH 2014年

35
「ロールイット」とはどういう意味ですか?
LarsH 2014年

50
これは「roll your own」の略で、アメリカ英語で「自分で作る」という意味です。
Scott C Wilson、

2
@Alan W. Smith、「ジャスト・ロール・イット:」は過去10年間、完全に問題なく機能していました。「アメリカ人が少ない」とはどういう意味ですか?私はあなたの編集には賛成しません。
Logic1

4
編集するとわかりやすくなります。誰もが母国語として英語を持っているわけではないので、 'roll it'のようなことを言うと混乱が生じる可能性があります
nxmohamad

327

pathlibPython 3.4以降での使用

from pathlib import Path

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

戻ります

'file'

9
これは、Python 3以降推奨される方法です
Miladiouss

1
os.pathソリューションと同様に、これは1つの拡張子のみを削除することに注意してください(またはsuffixpathlib呼びます)。Path('a.b.c').stem == 'a.b'
BallpointBen

@BallpointBen複数のサフィックスを取り除く最適な方法は何ですか?きっともっと良い方法があるに違いないPath(Path('a.b.c').stem).stem
ホアン

1
@hoan繰り返し呼び出すの.with_suffix('')が良い方法だと思います。あなたはおそらくまでループしたいと思うでしょうp.suffix == ''
BallpointBen

218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth

7
+1。3まったく同じ答えですが、これが最も直接的な答えです。`コードを表示するために使用し、パスインスタンスとして「/somepath/hermanth.txt」を使用することもできます。
cregox 2010年

2
@ hemanth.hmこのステートメントでos.path.basenameは、指定する必要がないことに注意してください。os.path.basenameファイルパスからファイル名を取得するためにのみ使用する必要があります。
arrt_

74

Python 3.4以降では、pathlibソリューションを使用できます

from pathlib import Path

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

4
なぜあなたresolve()は道を行くのですか?ファイルへのパスを取得し、それなしでファイル名をパスの一部にすることは本当に可能ですか?つまり、symlinkへのパスを指定すると、symlinkが指すファイルのファイル名(拡張子なし)が返されます。
ボリス

1
使用する1つの考えられる理由resolve()は、複数のドットの問題への対処を支援することです。パスが「./foo.tar.gz」の場合、インデックスの使用に関する以下の回答は機能しません
William

30

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

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

1
これは、フルパスから拡張機能を削除する一般的なケースに最適なpython 3ソリューションです。ステムを使用すると、親パスも削除されます。2つの拡張子(bla.tar.gzなど)が必要な場合は、2回使用することもできます:p.with_suffix( '')。with_suffix( '')。
Eelco van Vliet

24

ファイルへのパスを保持し、拡張子を削除するだけの場合

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

16
あなたが最後の期間に分割したい場合は、使用しrsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

21

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

1
index_of_dot = file_name.index( '。')これは、.envで分割されないようにファイルのベース名を取得した後に行われます
Dheeraj Chakravarthi

2
このような一連の拡張が一般的であるため、重要なポイント。.tar.gz .tar.bz .tar.7z

2
'haystack'.index('needle')haystackに針(上記の場合はドット.)が見つからない場合は、ValueError例外をスローすることに注意してください。拡張子のないファイルも存在します。
チェコ語2018年

15

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

ここにそれが綴られています:

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

私の報告書


13

しかし、osをインポートしても、path.basenameとは呼べません。ベース名と同じように直接呼び出すことはできますか?

import os、次に使用 os.path.basename

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


1
ただし、fooを直接呼び出す場合は、を使用できますfrom os import foo
tgray 2009年

osと呼ばれるメンバーがいる場合、モジュールの非常に非標準バージョンがありますfoo
Tadhg McDonald-Jensen

2
プレースホルダー名です。(例:path、またはを検討walk)。
Devin Jeanpierre

13

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'

os.path.splittext()はバージョン3.6以降
Yzmir Ramirez

6

他のメソッドは複数の拡張機能を削除しません。一部には、拡張子のないファイル名に関する問題もあります。このスニペットは両方のインスタンスを処理し、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

複数のドットを処理することの付加価値を除いて、この方法はよりもはるかに高速ですPath('/path/to/file.txt').stem。(1,23μsvs8.39μs)
raratiru

これは、ファイル名nvdcve-1.1-2002.json.zipに対して機能しません
Michele

私はそれをfileBasename.split( '。json')[0]で分割し、うまくいきました
Michele

4

import os

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

これは(C:\ Users \ Public \ Videos \ Sample Videos \ wildlife)filenameなしでを返しますextension

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

今、あなたfilenameは臨時雇用者からちょうど得ることができます

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

3

複数の拡張を認識する手順。パス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'


0

Windowsシステムでは、次のようにドライバ名のプレフィックスも使用しました。

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

したがって、ドライブ文字やディレクトリ名は必要ないため、以下を使用します。

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

0

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

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

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

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

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


0

非常に非常に非常に簡単に他のモジュールはありません!!!

import os
p = r"C:\Users\bilal\Documents\face Recognition python\imgs\northon.jpg"

# Get the filename only from the initial file path.
filename = os.path.basename(p)

# Use splitext() to get filename and extension separately.
(file, ext) = os.path.splitext(filename)

# Print outcome.
print("Filename without extension =", file)
print("Extension =", ext)

-1

ここ(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

os.path.splitext()[0]も同じことを行います。
Charles Plager

@CharlesPlager os.path.splitext()は、拡張機能に複数のドットがある場合は機能しません。 stackoverflow.com/a/37760212/1250044
yckart

それは私のために働きます:In [72]:os.path.splitext( 'one.two.three.ext')Out [72]:( 'one.two.three'、 '.ext')
Charles Plager

-1
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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.