2009-12-18 82 views
-6

使用Python將字符串「a.pdf」轉換爲「a.jpg」的最優雅方式是什麼?將字符串'a.pdf'轉換爲'a.jpg'最優雅的方式是什麼?

我希望我的代碼看起來很漂亮。

+6

請張貼您現在想要美化的代碼。 – 2009-12-18 12:03:15

+2

優雅 - 很好。但美麗嗎?我不記得在OO底漆上有>美女<的部分。儘量讓整個程序(嗯,也許不),或者至少它的總體特徵是美麗的。這是我的建議。並不是說它是可以實現的。代碼出生醜陋,死亡醜陋。就是那樣子。 – martinr 2009-12-18 15:27:56

+1

這些孩子什麼時候可以得到它?這是什麼裏面的數...... – curtisk 2009-12-18 18:11:40

回答

0
s = 'a.pdf' 
print s.replace('pdf', 'jpg') 

那你在找什麼?

+10

這是一個簡單的解決方案,但如果您有一個名爲「CopyOfMyPdf.jpg」的文件將會失敗。也許s.replace('。pdf','。jpg')會更好,但仍不完美 – ZombieSheep 2009-12-18 11:45:14

+0

yup..This看起來像最美麗的:) – Nullpoet 2009-12-18 11:45:38

+2

這是一個非常假設的解決方案。 – 2009-12-18 11:56:29

6

我不知道,如果它的優雅:

  • string.replace

    >>> s = "a.pdf" 
    >>> s.replace(".pdf", ".jpg") 
    

    'A.JPG'

  • 正則表達式:

    >>> import re 
    >>> re.sub("\.pdf$", ".jpg", "a.pdf") 
    'a.jpg' 
    
  • os.path

    >>> import os.path 
    >>> name, ext = os.path.splitext("a.pdf") 
    >>> "%s.jpg" % (name) 
    'a.jpg' 
    
  • 字符串索引:

    >>> s = "a.pdf" 
    >>> s[-3:] == "pdf" and s[:-3] + "jpg" 
    'a.jpg' 
    
+1

你的一些解決方案是不完善的。例如,「.pdf $」匹配「xpdf」以及「.pdf」。當然,替換字符串會對各種輸入做錯誤的事情。 – 2009-12-18 12:23:51

+0

「\ .pdf $」與「xpdf」不匹配,因爲正則表達式顯式查找擴展之前的點。 – kiamlaluno 2009-12-18 12:59:31

+0

@kiamlaluno,原來壞了。你正在看編輯版本,所以評論是「陳舊」。 – 2009-12-18 14:42:39

48

最 「正確」 這樣做的方法是像下面這樣。無論平臺是什麼,無論擴展是什麼,這都可以處理它,而且通常不需要重新發明輪子。

import os.path 
root, ext = os.path.splitext('a.pdf') 

# Optional error checking, if necessary: 
if ext.lower() != '.pdf': 
    raise ValueError('File lacks proper extension') 

filename = "%s.jpg" % (root,) 
+8

祝賀你的逆轉徽章,我有最後的失望;) – 2009-12-18 14:46:39

+5

歡迎來到逆轉俱樂部。出來回來,我們會教你祕密的握手。 (這不是真的那個祕密,你只需要轉身,用你的左手背在背後。) – 2009-12-18 15:55:02

+1

很好地完成!並用逆轉啓動 – curtisk 2009-12-18 18:13:34

2

不是最優雅的也許,但更安全:

root, ext = os.path.splitext(s) 
if ext != '.pdf': 
    # Error handling 
else: 
    s = root + '.jpg' 
1
>>> s = 'a.pdf' 
>>> s[-3:]=="pdf" and s[:-3]+"jpg" 
'a.jpg' 
3

使用$從正則表達式,以確保您替換文件擴展名。

>>> import re 
>>> s = 'my_pdf_file.pdf' 
>>> re.sub('\.pdf$', '.jpg', s) 
'my_pdf_file.jpg' 
+0

「.pdf $」匹配「xpdf」以及「.pdf」,因此將遠遠超過僅僅用文字替換文字字符串.pdf。 – 2009-12-18 12:25:06

+1

你有一個\。那裏 – 2009-12-18 12:31:38

+0

我看到你在那裏做了什麼。 – PaulMcG 2009-12-18 14:03:29

1

我的建議1ch1g0的解決方案,但不是s[-3:]=='pdf's.endswith('.pdf')並沒有「+」字符串是緩慢:

>>> s = 'a.pdf' 
>>> s.endswith('.pdf') and ''.join([s[:-3], 'jpg']) 
'a.jpg' 
+1

當連接多個字符串時''與'join'相比較慢,因爲只有一些'+'要快得多:我的機器中47ns vs 237ns,用'timeit'測量。 – fortran 2009-12-18 12:52:57

1

字符串是Python中不變的,所以基本上你不能改變它。

如果你想要一個新的字符串,有很多選擇,這取決於你真正想要的。

def silly_thing(s): 
    return s[:-4]+".jpg" if s[-4:] == ".pdf" else s 
+0

+1擊敗我10個月!另外,只要我們過度*文字*(等待它......),就應該說__return「a.jpg」; __(......看到一個雙關語!)。 – user359996 2010-10-10 09:00:22

1

這其中需要NumPy,但當然,這意味着它will run much faster比選擇:

>>> s = 'a.pdf' 
>>> from numpy import array 
>>> ''.join([chr(c) for c in (array([ord(c) for c in s]) + [0, 0, -6, 12, 1])]) 
'a.jpg' 

當然,你是否認爲這種「優雅」與否取決於你的定義「優雅」但與所有其他有用的信息一樣,這個問題並沒有包括這個問題......

編輯:是的,這是一個笑話,但試圖說明一點...

+0

你在開玩笑吧? – SilentGhost 2009-12-18 14:19:25

+0

絕對......我認爲這將是顯而易見的。太微妙了? – 2009-12-18 14:41:28

+0

另外,我還要如何獲得Peer Pressure徽章?別人,給我投票! :) – 2009-12-18 14:44:12

0

從@Peter Hansen的回答中得到了一些啓發,我設法創建了一個完成您需要的功能。雖然他的方法很好,但它有點缺乏,它只能轉換長度恰好爲5個字符的文件名。

我的解決方案解決了:

from numpy import array 

def convert_pdf_filename_to_jpg_filename_in_a_really_really_elegant_way(s): 
    """ 
    Examples: 
    >>> convert_pdf_filename_to_jpg_filename_in_a_really_really_elegant_way("a.pdf") 
    'a.jpg' 
    >>> convert_pdf_filename_to_jpg_filename_in_a_really_really_elegant_way("myfile.pdf") 
    'myfile.jpg' 
    """ 
    return ''.join([chr(c) for c in (array([ord(c) for c in s]) + list([0] * (len(s) - 3) + [-6, 12, 1]))]) 

我很滿意這個代碼。我不介意它是否被添加到Python標準庫(可能在really_really_elegant_code模塊中?)。但除此之外,還需要將numpy添加到標準庫中。有沒有人有想法,如果這可能發生?

相關問題