-1

我已经从另一个 SO 问题中复制了这段代码,但我无法解决我遇到的错误

这是我的代码

import os
import urllib2
import sys
d = urllib2.urlopen("http://www.google.com.au/logos/2012/new_years_eve_2012_-_english_only-1049005-hp.jpg")
o = open('image.%s' % d.info().gettype(), 'w')
o.write(d.read())

错误是

回溯(最后一次调用):文件“./image_test.py”,第 6 行,在 o = open('image.%s' % d.info().gettype(), 'w') IOError: [Errno 2]没有这样的文件或目录:'image.image/jpeg'

4

2 回答 2

2

它告诉你错误......没有这样的文件或目录:'image.image/jpeg'......所以很明显gettype返回类似“image/jpg”......你可以拆分它以获得扩展名(可能并不总是有效...)

o = open('image.%s' % d.info().gettype().split("/")[-1], 'w')
于 2012-12-31T01:35:38.947 回答
1

这是因为 HTML MIME 类型通常包含斜杠,例如image/jpeg. 这会导致混淆open,因为斜杠是文件系统路由中使用的特殊字符。

您只需要避免在文件名中使用斜杠,例如 Joran 建议的方式。

更新为了使它在所有情况下都能正常工作,您必须获得一个映射 MIME 类型 -> 文件扩展名。Apache 有一个:http: //svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types ?view=markup 。一旦你像这样将它解析为python字典:

import re

mimetypes = {}
with open('mime.types') as mimedata:
    for line in [line.strip() for line in mimedata.readlines()]:
        if line[0] == '#':
            continue

        # This pattern will only get the first extension in the list
        pattern = re.compile(r'([^\s]+)\s+([^\s]+)')
        result  = pattern.match(line)
        mime    = result.group(1)
        ext     = result.group(2)
        mimetypes[mime] = ext

您将通过以下方式使用它:

mime = d.info().gettype()
ext = ''
if mime in mimetypes:
    ext = mimetypes[mime]

o = open('data' + ext, 'w')
o.write(d.read())
于 2012-12-31T01:39:30.353 回答