Używam Pythona do pobierania plików z serwera ftp i jestem w stanie pobrać pliki, ale kiedy otwieram pliki, wydają się być uszkodzone lub nie otwierają Pliki takie jak piosenki lub jpg działają dobrze, ale dokumenty, arkusze Excela, pliki PDF i pliki tekstowe nie są pobierane prawidłowo.

Oto mój kod:

from ftplib import FTP
ftp = FTP()
ftp.connect(ip_address,port)
ftp.login(userid,password)
direc='directory path'
ftp.cwd(direc)
doc='doc.txt' or xlsx or pdf or jpg etc
download_path='path to download file on desktop'
file=open(download_path+ doc,'wb')
ftp.retrbinary(f"RETR {doc}", file.write)

Mogę pobrać wymagane pliki, ale większość z nich jest uszkodzona. Jakie zmiany powinienem wprowadzić, aby kod działał.

5
user13208311 3 kwiecień 2020, 11:49

3 odpowiedzi

Najlepsza odpowiedź

Nie mogę w tej chwili przetestować FTP, ale widzę problem z otwieraniem i nie zamykaniem pliku.

Opcja A:

file=open(download_path + doc,'wb')  # add '+' to append instead of overwriting
...
...
file.close()

Opcja B (menedżer kontekstu, przydatna, ponieważ zamyka plik po zakończeniu):

with open(download_path + doc,'wb') as file:
    file.write(*args, **kwargs)

Jeśli chodzi o użycie modułu ftplib, doskonała odpowiedź w następującym poście ftp.retrbinary () help python przez steveha.

Jeśli chodzi o otwieranie i zapisywanie do pliku za pomocą menedżera kontekstu, zobacz Jak otworzyć plik za pomocą instrukcji open with i obsługa wyjątków (dokumentacja Pythona 3), jak podaje sir-snoopalot

Sprawdź również dokumentację modułu ftplib w celu uzyskania dalszych wyjaśnień.

Mam nadzieję że to pomoże.

4
t3hSeb 3 kwiecień 2020, 09:39

Nie próbowałem twojego kodu, ale patrząc na dokumentację Pythona, być może zapomniałeś zamknąć plik i zakończyć poprawnie, więc bufor pliku może nie zostać w pełni zapisany na dysku.

Spróbuj tego:

with open(download_path+ doc,'wb') as fp:
    ftp.retrbinary(f"RETR {doc}", file.write)

ftp.quit()

Instrukcja with wykona funkcję close dla pliku podczas wychodzenia z tego bloku

2
MordicusEtCubitus 3 kwiecień 2020, 09:16

Zapomniałeś zamknąć plik. Po prostu dodaj poniższy kod na końcu swojego kodu.

file.close()
0
Hamza Khurshid 3 kwiecień 2020, 09:32