【问题标题】:Rewriting Image saves a corrupted file (Python)重写图像保存损坏的文件(Python)
【发布时间】:2021-09-26 21:39:13
【问题描述】:
    for i, pokemon in enumerate(pokemon):
        pokeurl = f"https://img.pokemondb.net/sprites/bank/normal/{pokemon}.png"
        r = requests.get(pokeurl, stream=True)
        open('pokemon.png', 'wb').write(r.content)
        #do_stuff

嗨,我是 python 的新手。这里第一次调用该函数,图像被保存(6倍,口袋妖怪的大小)。但是当我第二次调用相同的函数时,它保存了一个损坏的图像。

【问题讨论】:

  • 你能举一个pokemon列表的例子吗?
  • 口袋妖怪 = ["glaceon","aerodactyl","charizard","blastoise","greninja","haxorus","flareon","pikachu"]

标签: python image python-requests io


【解决方案1】:

使用唯一名称将图像保存在本地后,您的代码可以正常工作:

import requests
import os

pokemons = [
    "glaceon", "aerodactyl", "charizard", "blastoise", "greninja", "haxorus",
    "flareon", "pikachu"
]

for i, pokemon in enumerate(pokemons):
    pokeurl = f"https://img.pokemondb.net/sprites/bank/normal/{pokemon}.png"
    r = requests.get(pokeurl, stream=True)
    open(f'/tmp/p/{pokemon}.png', 'wb').write(r.content)

# verify images saved
print(os.listdir('/tmp/p'))

输出:

['charizard.png', 'flareon.png', 'pikachu.png', 'haxorus.png', 'blastoise.png', 'aerodactyl.png', 'greninja.png', 'glaceon.png']

【讨论】:

  • 个别文件确实存在,但它们已损坏?无法打开它们,大约 100 字节但由于我的代码逻辑是它不会有超过 6 个口袋妖怪,我只是做了一个做同样事情的函数并调用它六次,它奇迹般地工作了。这是请求在第二次尝试中无法获得可下载资源的问题
  • 我下载的所有文件都很好 (> 2KB) 并且可以访问。
【解决方案2】:

我想这取决于您打开文件的方式。

the docs所写

不使用 with 关键字调用 f.write() 或调用 f.close() 可能会导致 f.write() 的参数没有完全写入磁盘,即使程序成功退出。

所以只需使用上下文管理器

with open('pokemon.png', 'wb') as f:
    f.write(r.content)

【讨论】:

  • 注意:你也只是覆盖了相同的pokemon.png,所以循环有点不必要..
  • 感谢您的回复,但仍然无法正常工作。显然,如果我将链接更改为 Imgur 链接,它将完全正常。
猜你喜欢
  • 1970-01-01
  • 2014-12-27
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多