2009-12-18 43 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添加到标准库中。有没有人有想法,如果这可能发生?

相关问题