Как я могу проверить, содержит ли файл строку на SFTP-сервере в Python? - PullRequest
0 голосов
/ 05 июля 2018

Я могу подключиться к серверу и увидеть все файлы в данном каталоге, однако, я, кажется, всегда сталкиваюсь с проблемами при попытке открыть файл.

Сценарий таков: я хочу получить последний файл на основе даты с SFTP-сервера, затем я хочу проверить, содержит ли этот файл определенную строку. Если это так, верните true, если не верните false. Вот мое решение ниже:

def does_file_exists_on_sftp_server_and_contains_given_value(value):
    latest_date = 0
    latest_file = None
    retry_attempt = 0
    value_is_present= False

    while retry_attempt < 50:
        # the line below does the sftp server login and that works successfully 
        conn = vm_sftp_login()
        files = conn.listdir_attr("directory")
        for file in files:
            if file.filename.endswith(".xml") and file.st_mtime > latest_date:
                latest_date = file.st_mtime
                latest_file = file.filename
                retry_attempt = 50
        retry_attempt += 1
    latest_file_obj = conn.get(latest_file)
    file_obj = open(latest_file_obj)
    for line in file_obj:
        if value in line:
            value_is_present = True
            break
    return value_is_present

Код кажется сломанным в этот момент: latest_file_obj = conn.get(latest_file).

Traceback

self = <paramiko.sftp_client.SFTPClient object at 0x000001EF8E156748>
msg = paramiko.Message(b'\x00\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00\x0cNo such file\x00\x00\x00\x00')

    def _convert_status(self, msg):
        """
            Raises EOFError or IOError on error status; otherwise does nothing.
            """
        code = msg.get_int()
        text = msg.get_text()
        if code == SFTP_OK:
            return
        elif code == SFTP_EOF:
            raise EOFError(text)
        elif code == SFTP_NO_SUCH_FILE:
            # clever idea from john a. meinel: map the error codes to errno
>           raise IOError(errno.ENOENT, text)
E           FileNotFoundError: [Errno 2] No such file

Ответы [ 2 ]

0 голосов
/ 09 июля 2018
  1. Вам необходимо указать путь к файлу в Connection.get, как уже ответил @ a625993.

  2. Connection.get ничего не возвращает. Он загружает удаленный файл по локальному пути, указанному аргументом localpath. Если вы не укажете аргумент, он загрузит файл в текущий рабочий каталог.

    Если вы действительно хотите прочитать файл в переменную (что, как я понимаю, вы на самом деле не хотите), вам нужно использовать .getfo, например:

    flo = BytesIO()
    sftp.getfo(remotepath, flo)
    

    Либо используйте библиотеку Paramiko напрямую (без оболочки pysftp).
    См. Считывание файла с сервера с помощью ssh с использованием python .

0 голосов
/ 05 июля 2018

Я думаю, что ваша проблема может быть в том, что эта конкретная строка кода пытается получить доступ к файлу latest.xml вместо directory/latest.xml. Я лично не знаком с этой библиотекой, но если conn.listdir_attr() работает аналогично os.listdir() в python, то имя папки не указывается в каждом возвращаемом имени файла. Таким образом, если вы хотите открыть файл из этого списка, вы должны добавить имя каталога обратно.

Итак, попробуйте

latest_file_obj = conn.get('directory/' + latest_file)

вместо этого и посмотрите, работает ли он.

...