Как прочитать заголовок файла WAV с FTP напрямую, не загружая весь файл на Python?

1

Я хочу прочитать файл WAV (который находится на моем FTP-сервере) напрямую с FTP-сервера, не загружая его на мой компьютер в Python. Возможно ли это, и если да, то как?

Я попробовал это решение. Чтение файла в буфере из ftp python, но это не сработало. У меня есть аудио файл .wav. Я хочу прочитать файл и получить информацию из этого файла .wav, например размер файла, скорость передачи в байтах и т.д.

Мой код, в котором я мог читать файлы WAV локально:

import struct

from ftplib import FTP

global ftp
ftp = FTP('****', user='user-****', passwd='********')

fin = open("C3.WAV", "rb") 
chunkID = fin.read(4) 
print("ChunkID=", chunkID)

chunkSizeString = fin.read(4) # Total Size of File in Bytes - 8 Bytes
chunkSize = struct.unpack('I', chunkSizeString) # 'I' Format is to to treat the 4 bytes as unsigned 32-bit inter
totalSize = chunkSize[0]+8 # The subscript is used because struct unpack returns everything as tuple
print("TotalSize=", totalSize)
  • 0
    То есть у вас есть только FTP-сервер, а не HTTP, например?
  • 0
    @MartinPrikryl Я смог получить подробную информацию локально, но когда я попытался использовать предыдущее решение выше, я не смог прочитать только файл WAV. Если мне как-то удастся прочитать файл WAV с FTP, то я теперь, как получить подробную информацию о файлах WAV
Показать ещё 3 комментария
Теги:
audio
python-2.7
server
ftp
wav
ftplib

1 ответ

0
Лучший ответ

Для быстрой реализации вы можете использовать мой класс FtpFile из:
Получите имена файлов внутри zip файла на FTP-сервере, не скачивая весь архив

ftp = FTP(...)
fin = FtpFile(ftp, "C3.WAV")
# The rest of the code is the same

Код немного неэффективен, так как каждый fin.read открывает новое соединение для загрузки данных.


Для более эффективной реализации просто загрузите весь заголовок сразу (я не знаю структуру заголовка WAV, я загружаю 10 КБ здесь в качестве примера):

from io import BytesIO

ftp = FTP(...)
fin = BytesIO(FtpFile(ftp, "C3.WAV").read(10240))
# The rest of the code is the same

Ещё вопросы

Сообщество Overcoder
Наверх
Меню