OSError: [Errno 22] Недопустимый аргумент (Paramiko)

1

Я использую Paramiko для выполнения sftp для переноса файла из среды Linux в Windows.

Я попробовал разные решения в Stack Overflow, но все еще имел ту же проблему.

Мой скрипт

localpath = os.path.join(os.sep, 'Users', 'me', 'Desktop', 'ELK', 'PM_XML')
serverpath = r"***/****/***"
def sftp():
    ip=ipAddr.get()
    while True:
        current_time = time.time()
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip,username="root",password="root")
        sftp = ssh.open_sftp()
        for element in sftp.listdir(serverpath):
            if element.endswith(".xml"):
                creation_time = sftp.stat(serverpath+element).st_mtime
                if (current_time+3400 - creation_time) / (3600) <= 1:
                    sftp.get(serverpath+element,os.path.join(os.sep,localpath,element))
        sftp.close()
        ssh.close()

Я получаю эту ошибку:

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
  File "C:\Users\me\AppData\Local\Programs\Python\Python37-32\lib\site-packages\paramiko\sftp_client.py", line 801, in g
et
    with open(localpath, "wb") as fl:
OSError: [Errno 22] Invalid argument: '\\Users\\me\\Desktop\\ELK\\PM_XML\\A2018-10-18T11:03:00+02:00-2018-10-18T11:04:00
+02:00_user-67-0-test-vm2.lk.fr.xml'

Я думаю, проблема связана с именем файла

A2018-10-18T11: 03: 00 +02: 00-2018-10-18T11: 04: 00 +02: 00_user-67-0-test-vm2.lk.fr.xml '

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

Любые предложения по работе с этим именем файла, потому что я хотел бы сохранить одно и то же имя, используемое на сервере.

Решено Мартином Прикрилом предложение заменить двоеточие ":" на "_"

element.replace(":","_")
  • 0
    Работает ли это, если вы используете обычный клиент sftp для такой же передачи?
  • 0
    Да, я использовал простое имя файла что-то вроде этого \ Users \ me \ Desktop \ ELK \ PM_XML \ test.xml, и оно отлично работает.
Показать ещё 2 комментария
Теги:
python-3.x
paramiko
sftp

1 ответ

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

В Windows, имя файла не может содержать двоеточие (:), среди других специальных символов.

Документация Microsoft по соглашениям об именах:

Используйте любой символ в текущей кодовой странице для имени, включая символы Юникода и символы в расширенном наборе символов (128–255), за исключением следующего:

  • ...

  • : (двоеточие)

  • ...


Там ничего не поделаешь.

  • 0
    Системный диск должен быть NTFS, и в этом случае двоеточие используется для указания файловых потоков в форме «FileName: StreamName: StreamType». Так что это допустимо в каждом компоненте пути, от имени устройства (например, «C:») до компонентов каталога (например, «DirName: $ I30: $ INDEX_ALLOCATION») до обычных файловых компонентов (например, «FileName :: $ DATA») , Но двоеточие не является частью имени базового файла или каталога и не допускается в имени.
  • 1
    Обратите внимание, что документация Microsoft не совсем верна. Они говорят о своих собственных драйверах файловой системы. Драйверы файловой системы Windows на самом деле должны только зарезервировать обратную косую черту, и для разумного взаимодействия также должны зарезервировать косую черту, ноль и пять подстановочных знаков - звездочку, знак вопроса, знак «меньше» ( DOS_STAR ), знак «больше» ( DOS_QM ) и кавычка ( DOS_DOT ). Им не нужно резервировать двоеточие, вертикальную черту (трубу) или управляющие символы (порядковые номера 1-31). Примером этого является VboxSharedFolderFS, используемая в гостевой виртуальной машине VirtualBox.
Показать ещё 3 комментария

Ещё вопросы

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