AttributeError: obiekt „module” nie ma atrybutu „urlretrieve”

82

Próbuję napisać program, który pobierze pliki mp3 ze strony internetowej, a następnie połączy je ze sobą, ale za każdym razem, gdy próbuję pobrać pliki, pojawia się ten błąd:

Traceback (most recent call last):
File "/home/tesla/PycharmProjects/OldSpice/Voicemail.py", line 214, in <module> main()
File "/home/tesla/PycharmProjects/OldSpice/Voicemail.py", line 209, in main getMp3s()
File "/home/tesla/PycharmProjects/OldSpice/Voicemail.py", line 134, in getMp3s
raw_mp3.add = urllib.urlretrieve("http://www-scf.usc.edu/~chiso/oldspice/m-b1-hello.mp3")
AttributeError: 'module' object has no attribute 'urlretrieve'

Linia, która powoduje ten problem, to

raw_mp3.add = urllib.urlretrieve("http://www-scf.usc.edu/~chiso/oldspice/m-b1-hello.mp3")
Sike1217
źródło

Odpowiedzi:

211

Ponieważ używasz Pythona 3, nie ma już modułu urllib. Został podzielony na kilka modułów.

Byłoby to równoważne z urlretrieve:

import urllib.request
data = urllib.request.urlretrieve("http://...")

urlretrieve zachowuje się dokładnie tak samo, jak w Pythonie 2.x, więc będzie działać dobrze.

Gruntownie:

  • urlretrieve zapisuje plik w pliku tymczasowym i zwraca krotkę (filename, headers)
  • urlopenzwraca Requestobiekt, którego readmetoda zwraca bajt zawierający zawartość pliku
dom0
źródło
2
Gdybym chciał pobrać pliki .mp3 na listę, czy to nadal zadziała?
Sike1217,
3
Napotkałem ten błąd podczas pracy z samouczkiem uczenia maszynowego tensorflow Google (jestem nowy w Pythonie, więc Twoja odpowiedź jest bardzo doceniana) tensorflow.org/tutorials/mnist/beginners/index.md
Chris Smith
10

Rozwiązanie zgodne z Python 2 + 3 to:

import sys

if sys.version_info[0] >= 3:
    from urllib.request import urlretrieve
else:
    # Not Python 3 - today, it is most likely to be Python 2
    # But note that this might need an update when Python 4
    # might be around one day
    from urllib import urlretrieve

# Get file from URL like this:
urlretrieve("http://www-scf.usc.edu/~chiso/oldspice/m-b1-hello.mp3")
Martin Thoma
źródło
@ tim654321 Zmieniłem to. Masz rację, jest szansa, że ​​tak samo będzie w Pythonie 3 i nowszych wersjach.
Martin Thoma
Komentarz do twojego komentarza („Not Python 3 ...”): Ponieważ sprawdzasz >= 3, obawa dotycząca Python4 nie jest uzasadniona.
Martin R.
@MartinR. a raczej ..., notatki o Pythonie 4 powinny być >= 3zamiast tego w bloku.
Jesse Chisholm
4

Załóżmy, że masz następujące wiersze kodu

MyUrl = "www.google.com" #Your url goes here
urllib.urlretrieve(MyUrl)

Jeśli otrzymujesz następujący komunikat o błędzie

AttributeError: module 'urllib' has no attribute 'urlretrieve'

Następnie spróbuj wykonać następujący kod, aby rozwiązać problem:

import urllib.request
MyUrl = "www.google.com" #Your url goes here
urllib.request.urlretrieve(MyUrl)
Amir Md Amiruzzaman
źródło