使用Python将字符串“a.pdf”转换为“a.jpg”的最优雅方法是什么?
我希望我的代码看起来很漂亮。
答案 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添加到标准库中。有没有人知道这是否可能发生?