回答:
はい。使用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'
ほとんどの手動の文字列分割試行とは異なり、os.path.splitext
は/a/b.c/d
extensionの代わりに拡張子なしとして正しく処理し、extensionの代わりに拡張子なしとして.c/d
扱います。.bashrc
.bashrc
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()
よりポータブルでpythonicにならないでしょうか?
.asd
本当に拡張機能です!! あなたが考えてみれば、foo.tar.gz
あるgzipで圧縮されたファイル(.gz
あることを起こる)tarファイル(.tar
)。ただし、そもそもgzipファイルです。デュアルエクステンションが返されるとはまったく思いません。
splittext
ます。彼らはちょうどこの名前の部分の間の休憩を意味する何かをするならば、それはだことを認識することがはるかに容易になるだろうsplitExt
かsplit_ext
。きっとこの間違いをしたのは私だけではないでしょうか?
os.path.splitext('somefile.ext')
=> ('somefile', '.ext')
。第三者のライブラリを参照せずに、実際の反例を気軽に提供してください。
import os.path
extension = os.path.splitext(filename)[1]
import os.path
代わりにfrom os import path
?
from os import path
名前path
が使用されます。また、コードを見ている他の人は、パスがosモジュールからのパスであることをすぐに認識できない場合があります。まるでそれを使用しimport os.path
ているかのように、それをos
名前空間内に保ち、どこに呼び出しを行っても、それpath()
がos
モジュールからのものであることをすぐに人々に知らせます。
_, extension = os.path.splitext(filename)
がはるかに見栄えが良いと感じています。
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
バージョン3.4の新機能。
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
誰もpathlib
まだ言及していないことに驚いていpathlib
ます。すごいです!
すべてのサフィックスが必要な場合(たとえば、がある場合.tar.gz
)は、.suffixes
それらのリストを返します。
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
せいぜい.tar.gzだけを確実に取得するために使用されるべきです。
1つのオプションがドットから分割されている可能性があります。
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
ファイルに拡張子がない場合でもエラーなし:
>>> "filename".split(".")[-1]
'filename'
ただし、注意が必要です。
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
'file.tar.gz'.split('.')
['file.tar', 'gz']
'file.tar.gz'.rsplit('.', 1)
上記の解決策はどれでも機能しますが、Linuxでは、一致が成功しないようにする拡張文字列の最後に改行があることがわかりました。strip()
メソッドを最後に追加します。例えば:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
中.splittext(filename)[1][1:]
) -事前にあなたに感謝
splittext()
'。'を使用して文字列を分割する場合とは異なり) '。'が含まれている 拡張子の文字。追加[1:]
はそれを取り除きます。
splitextダブル拡張子を持つファイルに問題がある(例えばfile.tar.gz
、file.tar.bz2
など。)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
しかし: .tar.gz
可能な解決策はこちらです
gunzip somefile.tar.gz
出力ファイル名は何ですか?
古いトピックですが、この場合rpartitionと呼ばれるpythonの非常に単純なAPIについて言及されていないのはなぜでしょうか。
特定のファイルの絶対パスの拡張子を取得するには、次のように入力するだけです。
filepath.rpartition('.')[-1]
例:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
あなたに与える: 'csv'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
。セパレータが見つからない場合、返されるタプルは次のようになります("", "", "the original string")
。
これはまだ言及されていないことに驚いた:
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
[-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])
ファンシーについては... dictで拡張機能を収集し、それらをすべてフォルダーで追跡します。次に、必要な拡張機能をプルします。
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)
これを試して:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
有効なファイル名です。それをあなたのコードに投げたらどうなりますか?どう.bashrc
かfoo
?これにはライブラリ関数があります...
# 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(".")
これにより、最も一般的な最初の「。」までのファイル名が得られます。
file.name.ext
basename
ので、ここでの使用は少し混乱しますos.path.basename("/path/to/somefile.ext")
"somefile.ext"