Ошибка при загрузке аудиофайла из zip в python - PullRequest
0 голосов
/ 13 сентября 2018

Я создаю игру, и мне нужно загрузить некоторые защищенные паролем аудиофайлы из 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()

Что я могу сделать, чтобы загрузить звуковые файлы без появления такой ошибки? А что такое «искать»?

Ответы [ 2 ]

0 голосов
/ 30 июля 2019

Попробуйте заменить

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().


EDIT:
Теперь я понимаю, что вышеуказанное решение уже существует в вашем коде, когда вы 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))
0 голосов
/ 26 февраля 2019

Я также получаю эту ошибку на Python 3.6.

Я собираюсь догадаться, что pygame.mixer.music.load вызывает метод seek для zippie, который является ZipExtFile.

Начиная с Python 3.7 ZipExtFile объекты теперь имеют метод поиска.Я думаю, что если вы обновитесь до Python 3.7.2 или новее, ваша ошибка должна исчезнуть.

...