2013-04-06 66 views
12

Tôi đã có đường dẫn đầy đủ của tập tin trong một danh sách như thế này:Làm thế nào để thoát khỏi các phần mở rộng từ file basename sử dụng python

a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx'] 

những gì tôi muốn là để có được chỉ là tên tập tin mà không cần phần mở rộng của họ, như :

b = ['datafile', 'datafile2', 'datafile3'] 

Những gì tôi đã cố gắng là:

xfn = re.compile(r'(\.xls)+') 
for name in a: 
    fp, fb = os.path.split(fp) 
    ofn = xfn.sub('', name) 
    b.append(ofn) 

Nhưng nó kết quả trong:

b = ['datafilex', 'datafile2', 'datafile3x'] 
+0

sử dụng 'str.replace()' cho việc này. nó là nhiều, ** nhiều ** nhanh hơn – Amelia

+2

Bạn có _have_ để sử dụng regexes ở tất cả? 'os.path.splitext' xóa phần mở rộng ... – Ben

Trả lời

28
  1. Regex bạn đã sử dụng sai. (\.xls)+ khớp với các chuỗi có dạng .xls, .xls.xls, v.v. Đây là lý do tại sao còn lại x trong các mục .xlsx. Những gì bạn muốn là \.xls.*, ví dụ: .xls, tiếp theo là 0 hoặc nhiều hơn bất kỳ ký tự nào.

  2. Bạn không thực sự cần sử dụng regex. Có các phương pháp chuyên biệt trong os.path đề với điều này: basenamesplitext.

    >>> import os.path 
    >>> os.path.basename('home/robert/Documents/Workspace/datafile.xlsx') 
    'datafile.xlsx' 
    >>> os.path.splitext(os.path.basename('home/robert/Documents/Workspace/datafile.xlsx'))[0] 
    'datafile' 
    

    như vậy, giả sử bạn không thực sự quan tâm đến .xls/.xlsx hậu tố, mã của bạn có thể đơn giản như:

    >>> a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx'] 
    >>> [os.path.splitext(os.path.basename(fn))[0] for fn in a] 
    ['datafile', 'datafile2', 'datafile3'] 
    

    (cũng lưu ý các list comprehension.)

+0

+1 cho cả hai cách điều chỉnh phương pháp không chính xác của OP và để cung cấp giải pháp tốt hơn cho vấn đề – dgraziotin

4

Oneliner:

>>> filename = 'file.ext' 
>>> '.'.join(filename.split('.')[:-1]) if '.' in filename else filename 
'file' 
0

Tại sao không chỉ sử dụng phương pháp split?

def get_filename(path): 
    """ Gets a filename (without extension) from a provided path """ 

    filename = path.split('/')[-1].split('.')[0] 
    return filename 


>>> path = '/home/robert/Documents/Workspace/datafile.xlsx' 
>>> filename = get_filename(path) 
>>> filename 
'datafile' 
+1

' get_filename ('/ path/to/some/file.tar.bz2') == 'tệp' - phải là 'tệp.tar' –

Các vấn đề liên quan