将字符串'a.pdf'转换为'a.jpg'的最优雅方式是什么?

时间:2009-12-18 11:39:08

标签: python string

使用Python将字符串“a.pdf”转换为“a.jpg”的最优雅方法是什么?

我希望我的代码看起来很漂亮。

10 个答案:

答案 0 :(得分: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,)

答案 1 :(得分: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'
    

答案 2 :(得分:3)

使用regex中的$确保替换文件扩展名。

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

答案 3 :(得分:2)

也许不是最优雅,但更安全:

root, ext = os.path.splitext(s)
if ext != '.pdf':
    # Error handling
else:
    s = root + '.jpg'

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我建议1ch1g0的解决方案,但不是s[-3:]=='pdf's.endswith('.pdf')而没有'+'表示慢的字符串:

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

答案 6 :(得分:1)

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

如果你想要一个新的字符串,有很多选择,具体取决于你想要的。

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

答案 7 :(得分: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'

当然,您是否认为这种“优雅”取决于您对“优雅”的定义,但与所有其他有用信息一样,问题不包括......

编辑:是的,这是一个笑话,但试图说明一点......

答案 8 :(得分:0)

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

那你在寻找什么?

答案 9 :(得分: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添加到标准库中。有没有人知道这是否可能发生?