在 python 中从 zip 加载音频文件时出错

Posted

技术标签:

【中文标题】在 python 中从 zip 加载音频文件时出错【英文标题】:Error when loading audio file from zip in python 【发布时间】:2018-09-13 09:46:16 【问题描述】:

我正在制作游戏,我需要从 .zip 文件中加载一些受密码保护的音频文件,但出现此错误:

io.UnsupportedOperation: seek
io.UnsupportedOperation: seek
io.UnsupportedOperation: seek
b'hey you did it!' #THIS IS FROM THE PROGRAM
Traceback (most recent call last):
  File "C:\Python36\lib\zipfile.py", line 849, in read
    data = self._read1(n)
  File "C:\Python36\lib\zipfile.py", line 917, in _read1
    data += self._read2(n - len(data))
  File "C:\Python36\lib\zipfile.py", line 949, in _read2
    data = self._fileobj.read(n)
  File "C:\Python36\lib\zipfile.py", line 705, in read
    self._file.seek(self._pos)
AttributeError: 'NoneType' object has no attribute 'seek'

这是我下面的代码:

from zipfile import ZipFile
from PIL import Image
from io import BytesIO
import pygame
from pygame.locals import *
import pyganim
import sys

pygame.init()
root = pygame.display.set_mode((320, 240), 0, 32)
pygame.display.set_caption('image load test')


#THIS IS HOW TO LOAD IMAGES (WORKS)
with ZipFile("spam.zip", 'r') as archive:
    mcimg = archive.read('a.png', pwd=b'onlyforthedev')
    mc = pygame.image.load(BytesIO(mcimg))
    anime = pyganim.PygAnimation([(mc, 100),
                                  (mc, 100)])
    anime.play()

#THIS IS HOW TO LOAD MUSIC (DOES NOT WORK)
with ZipFile('spam.zip') as zippie:
    with zippie.open('zora.mp3', pwd=b'onlyforthedev') as zora:
        pygame.mixer.music.load(zora)
        pygame.mixer.music.play(-1)

#THIS IS HOW TO LOAD TEXT (WORKS)
with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt', pwd=b'onlyforthedev') as myfile:
        print(myfile.read())

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    root.fill((100, 50, 50))
    anime.blit(root, (100, 50))
    pygame.display.update()

如何加载声音文件而不引发此类错误?什么是“寻找”?

【问题讨论】:

【参考方案1】:

我在 python 3.6 上也遇到此错误。

我猜pygame.mixer.music.load 调用zippie 上的seek 方法,这是一个ZipExtFile

从 python 3.7 开始,ZipExtFile 对象现在有一个 seek 方法。我认为如果您升级到 python 3.7.2 或更高版本,那么您的错误应该会消失。

【讨论】:

【参考方案2】:

尝试替换

pygame.mixer.music.load(zora)

with BytesIO(zora.read()) as zora_bio:
    pygame.mixer.music.load(zora_bio)

这在 python 3.6 上对我有用,h5py.File()。 我猜这与pygame..load() 的问题相同。


编辑: 我现在意识到当您LOAD IMAGES 时,上述解决方案已经存在于您的代码中:

with ZipFile("spam.zip", 'r') as archive:
    mcimg = archive.read('a.png', pwd=b'onlyforthedev')
    mc = pygame.image.load(BytesIO(mcimg))

所以为了统一,你可以LOAD MUSIC以类似的方式:

with ZipFile('spam.zip') as zippie:
    zora = zippie.read('zora.mp3', pwd=b'onlyforthedev')
    pygame.mixer.music.load(BytesIO(zora))

【讨论】:

以上是关于在 python 中从 zip 加载音频文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中从 cURL GET 请求保存 .zip 文件

在 Python 中从克隆的 GitHub 存储库创建 Zip 存档

openCV - 如何在 Windows 8.1 中从为 github 下载的用于 python 的 .zip 文件重建?

在 Python 中从 JSON 字符串中提取数据时出错(使用 Redshift)

使用 Linkage 从库中加载音频文件时出错

在 Pyspark 中从 Rest Api 创建数据框时出错