Чтение файла .csv в память с сервера SFTP с использованием Python Paramiko

Я пытаюсь прочитать CSV-файл по SFTP в моей памяти Python. Я пробовал следующее, которое отлично работает для FTP-соединения, но не для SFTP.

Например, я хочу воспроизвести:

df = pd.read_csv(...)

Но не сохраняя его сначала локально (причина в том, что я хочу запустить его как облачную функцию, а затем мне не нужны локальные файлы в моем кеше).

Как мне это сделать по-другому?

def read_file_sftp_local_memory(sftp, path, filename):

    flo = BytesIO()
    path_query = "".join(['RETR ', path, '/', filename])
    sftp.retrbinary(path_query, flo.write)
    flo.seek(0)
    return flo

Я пробовал также следующее:

def read_file_csv(sftp, path, filename):

    # Download
    sftp.get("/".join( os.path.join(path, filename) ), filename)

    # Read
    df = pd.read_csv(filename)

    # Delete
    os.remove(filename)

    # Return
    return df

Но это вернулось:

Ошибка:

raise IOError(text)
OSError: Failure

person JohnAndrews    schedule 18.06.2019    source источник


Ответы (1)


Предполагая, что вы используете SFTP-библиотеку Paramiko, используйте SFTPClient.open метод:

with sftp.open(path) as f:
    f.prefetch()
    df = pd.read_csv(f)

Чтобы узнать о prefetch, см. Чтение файла, открытого с помощью метода Python Paramiko SFTPClient.open, выполняется медленно .

person Martin Prikryl    schedule 18.06.2019