ファイル名から拡張子を抽出する機能はありますか?
27 に答える
はい。使用しますos.path.splitext
( Python 2.X のドキュメントまたはPython 3.X のドキュメントを参照):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
ほとんどの手動の文字列分割試行とは異なり、はextension を持つ代わりに拡張子なしとしてos.path.splitext
正しく扱い、 extension を持つ代わりに拡張子なしとして扱います:/a/b.c/d
.c/d
.bashrc
.bashrc
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
import os.path
extension = os.path.splitext(filename)[1]
バージョン 3.4 の新機能。
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
誰もpathlib
まだ言及していないことに驚いていpathlib
ます。
すべてのサフィックスが必要な場合 (たとえば、 がある場合.tar.gz
) は.suffixes
、それらのリストを返します!
import os.path
extension = os.path.splitext(filename)[1][1:]
ドットなしで拡張子のテキストのみを取得します。
単純な使用例では、1 つのオプションがドットから分割される場合があります。
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
ファイルに拡張子がない場合、エラーは発生しません:
>>> "filename".split(".")[-1]
'filename'
ただし、次の点に注意する必要があります。
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
また、Unix システムの隠しファイルでは機能しません。
>>> ".bashrc".split(".")[-1]
'bashrc' # But this is not an extension
一般的な使用のために、好むos.path.splitext
JPG がリストに表示されない理由を疑問に思わないように、下に追加する価値があります。
os.path.splitext(filename)[1][1:].strip().lower()
上記の解決策はどれも機能しますが、Linux では、拡張文字列の最後に改行があり、一致が成功しないことがわかりました。strip()
メソッドを最後に追加します。例えば:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
分割テキストでは、拡張子が 2 つあるファイルに問題があります (例: file.tar.gz
、file.tar.bz2
など)。
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
ただし、次のようにする必要があります。.tar.gz
考えられる解決策はこちら
古いトピックですが、この場合、rpartition と呼ばれる非常に単純な python の API について言及していないのはなぜでしょうか。
特定のファイルの絶対パスの拡張子を取得するには、次のように入力するだけです。
filepath.rpartition('.')[-1]
例:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
あなたに与えるでしょう:「csv」
これがまだ言及されていないことに驚いた:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
利点:
- 私が考えることができるものは何でも期待どおりに動作します
- モジュールなし
- 正規表現なし
- クロスプラットフォーム
- 簡単に拡張可能 (例: 拡張用の先行ドットなし、拡張の最後の部分のみ)
関数として:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
これは直接的な文字列表現のテクニックです: 多くの解決策が言及されていますが、ほとんどは分割を見ていると思います。ただし、分割は「。」が出現するたびに行われます。. あなたが探しているのはパーティションです。
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
右分割による別のソリューション:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
ファンシーの場合...拡張機能を辞書に収集し、それらすべてをフォルダー内で追跡します。次に、必要な拡張機能を引っ張るだけです。
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
name_only=file_name[:filename.index(".")
これにより、最も一般的な最初の「.」までのファイル名が得られます。