IOError: [Errno 13] Permission denied - ftplib

Я пытаюсь загрузить файлы с ftp-сервера, но у меня возникает ошибка, в которой отказано в разрешении.

Traceback (most recent call last):
   File "/Users/x34/Documents/Python/ftp_download.py", line 27, in <module>
     download()
   File "/Users/x34/Documents/Python/ftp_download.py", line 21, in download
     with open(filename,'wb') as f:
IOError: [Errno 13] Permission denied: '/p012r018_5dt19900722_z20_30.tif.gz'

Загрузка вручную или с помощью filezilla работает нормально, но мой сценарий ниже не работает.

from ftplib import ftp    
ftp = FTP(r'ftp.glcf.umd.edu')
ftp.login()

directory = 'glcf/Landsat/WRS2/p012/r018/p012r018_5dx19900722.TM-GLS1990'
filename = '/p012r018_5dt19900722_z20_30.tif.gz'

ftp.cwd(directory)

with open(filename,'wb') as f:
    ftp.retrbinary('RETR' + filename,f.write)

ftp.close()

Еще одно примечание ... и, возможно, я неправильно прочитал документы - http://docs.python.org/library/ftplib.html, но я не совсем понимаю, где ftplib решает загрузить файлы (каталог загрузки по умолчанию?). Есть ли другой модуль, лучше подходящий для этого приложения?

ОБНОВЛЕНИЕ

Я должен уточнить, что имя файла на сервере не содержит символа «/» впереди. Я просто добавил это, чтобы помочь найти правильное расположение и имя файла, поскольку предыдущие попытки закончились следующей ошибкой ftplib.error_perm: 500 Unknown command.

полный путь к файлу

 ftp.glcf.umd.edu/glcf/Landsat/WRS2/p012/r018/p012r018_5dx19900722.TM-GLS1990/p012r018_5dt19900722_z20_30.tif.gz'

person GeoPy    schedule 10.08.2012    source источник
comment
Похоже, ваш сценарий пытается сохранить загруженный контент в файл в корне (/) вашей файловой системы. У вас там достаточно разрешений? Он пытается сохранить файл с исходным именем файла, которому предшествует /, таким образом создавая файл в /.   -  person Valdir Stumm Junior    schedule 11.08.2012
comment
основная причина добавления / впереди заключалась в том, что это казалось шагом вперед, потому что до того, как он выдал мне еще одну ошибку, это была последняя часть этой трассировки - ›/Library/Frameworks/Python.framework/Versions/2.7/lib /python2.7/ftplib.py, строка 219, в getresp поднять error_perm, соответственно ftplib.error_perm: 500 Неизвестная команда.   -  person GeoPy    schedule 11.08.2012
comment
Попробуйте добавить в код пробел после REPR. Я обновил код в ответе. Вы объединяете REPR с именем файла, но правильным будет: REPR file.txt   -  person Valdir Stumm Junior    schedule 11.08.2012


Ответы (2)


Он сохраняет ваш файл там, где вы его просите сохранить, в строке with open(filename,'wb') as f: вы открываете файл для сохранения полученного содержимого.

И, поскольку ваше имя файла начинается с /, он пытается сохранить в корень (/) вашей файловой системы, где, похоже, у вас недостаточно прав.

Попробуй это:

from ftplib import ftp    
ftp = FTP(r'ftp.glcf.umd.edu')
ftp.login()

directory = 'glcf/Landsat/WRS2/p012/r018/p012r018_5dx19900722.TM-GLS1990'
filename = '/p012r018_5dt19900722_z20_30.tif.gz'

ftp.cwd(directory)

with open(filename[1:],'wb') as f: # slices the string, "cutting" out the "/"
    ftp.retrbinary('RETR ' + filename,f.write)

ftp.close()

Обратите внимание, что мы изменили имя файла, чтобы оно было записано в вашей файловой системе (строка with open(filename[1:],'wb') as f:). Взгляните на этот вопрос, если вы не знаете оператор среза. .

Кроме того, вы должны поставить пробел в конце строки 'RETR' в вашем коде. Это должно быть 'RETR ' + filename вместо 'RETR' + filename. «RETR somefile.txt» - это команда для FTP-сервера, а вы выполняли «RETRsomefile.txt», искажая команду именем файла.

person Valdir Stumm Junior    schedule 10.08.2012
comment
Я пробовал ваши предложения как на моем компьютере, так и на Mac, но безрезультатно, поскольку это дает мне ошибку /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py, строка 219, в getresp raise error_perm, resp ftplib.error_perm: 500 Неизвестная команда ------ ftp-сайт является бесплатным для всех, если кто-то хочет попробовать, если это только мои компьютеры? - person GeoPy; 11.08.2012
comment
После исправления кода с пробелом в конце «RETR» я получаю ошибку разрешения на сервере. - person Valdir Stumm Junior; 11.08.2012

Вы используете одну и ту же переменную имени файла в двух местах, где я предполагаю, что корень "/" действителен для вашего ftp, но, очевидно, проблема с правами доступа локально.

Попробуйте использовать "/" в команде ftp, но без "/" в локальном файле, который вы открываете.

person jdi    schedule 11.08.2012