Pythonでパスから拡張子なしのファイル名を取得する方法?
拡張子なしでファイルの名前を取得する:
import os
print(os.path.splitext("path_to_file")[0])
それを転がすだけです:
>>> 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'
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth
Python 3.4以降でPathlib
を使用した、読みやすいバージョン
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
印刷します。
ファイル
パスが シンボリックリンク になる場合は、resolve()
を追加します。
Path('/root/dir/sub/file.ext').resolve().stem
完全を期すために、Python 3.2+用のpathlib
ソリューションを紹介します。
from pathlib import Path
print(Path(your_path).resolve().stem)
ファイルへのパスをそのままにして、拡張子を削除するだけの場合
>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2
拡張子に複数のドットがある場合は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
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
しかし、osをインポートしても、path.basenameと呼ぶことはできません。 basenameとして直接呼び出すことは可能ですか?
import os
を使用してからos.path.basename
を使用
import
ing os
は、os
を参照せずにos.foo
を使用できるという意味ではありません。
@ IceAdor'sは@ user2902201の解決策に対するコメントの中のrsplitを参照しています。 rsplitは、複数期間をサポートする最も簡単なソリューションです。
ここでは詳しく説明します。
file = 'my.report.txt'
print file.rsplit('.', 1)[0]
私の報告書
私は配列インデックスを使う必要なしに 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'
import os
filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv
これはfilename
name__を除いてextension
name__を返します(C:\ Users\Public\Videos\Sample Videos\wildlife)
temp = os.path.splitext(filename)[0]
これで、一時ファイルからfilename
name__だけを取得できます。
os.path.basename(temp) #this returns just the filename (wildlife)
複数の内線を意識した手順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'
他の方法では、複数の拡張機能は削除されません。また、拡張子のないファイル名に問題がある場合もあります。このスニペットは両方のインスタンスを処理し、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
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
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
これを解決する最も簡単な方法は
import ntpath
print('Base name is ',ntpath.basename('/path/to/the/file/'))
これにより、時間と計算コストを節約できます。
最大の難解な場合:
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
を使用してください
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
ここで見られるように( 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
の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でテスト済み。