【问题标题】:simple errors in python urllib scriptpython urllib脚本中的简单错误
【发布时间】:2012-12-31 19:17:18
【问题描述】:

我已经从另一个 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())

错误是

Traceback(最近一次调用最后一次):文件“./image_test.py”,第 6 行, 在 o = open('image.%s' % d.info().gettype(), 'w') IOError: [Errno 2] No such file or directory: 'image.image/jpeg'

【问题讨论】:

    标签: python centos urllib2


    【解决方案1】:

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

    o = open('image.%s' % d.info().gettype().split("/")[-1], 'w')
    

    【讨论】:

    • 你说过,它可能并不总是有效。有什么方法总是有效的
    【解决方案2】:

    这是因为 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())
    

    【讨论】:

    • 如何将其解析为mimetypes。我没听懂
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2017-02-13
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多