Я использую 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(":","_")
В Windows, имя файла не может содержать двоеточие (:
), среди других специальных символов.
Документация Microsoft по соглашениям об именах:
Используйте любой символ в текущей кодовой странице для имени, включая символы Юникода и символы в расширенном наборе символов (128–255), за исключением следующего:
...
: (двоеточие)
...
Там ничего не поделаешь.
DOS_STAR
), знак «больше» ( DOS_QM
) и кавычка ( DOS_DOT
). Им не нужно резервировать двоеточие, вертикальную черту (трубу) или управляющие символы (порядковые номера 1-31). Примером этого является VboxSharedFolderFS, используемая в гостевой виртуальной машине VirtualBox.