Python Download Files from a URL Example

This beginner-friendly example shows how to download a file from a URL in Python and save it on your computer.

You will learn how to:

  • download a file from a web address
  • save it locally
  • use requests.get() to fetch the file
  • write the file safely with binary mode
  • handle common problems like bad URLs and missing packages

Quick example #

import requests

url = "https://example.com/file.txt"
response = requests.get(url)
response.raise_for_status()

with open("file.txt", "wb") as file:
    file.write(response.content)

print("Download complete")

This is the fastest working example. It downloads the file and saves it as file.txt in the current folder.

What this example does #

  • Downloads a file from a web address
  • Saves the file to your computer
  • Uses requests.get() to fetch data
  • Uses wb mode to write binary data safely

What you need before running it #

Before you run the script, make sure you have:

  • Python installed
  • The requests package installed
  • A valid file URL
  • Permission to write files in the current folder

If requests is not installed, run:

pip install requests

If you are not sure Python is installed correctly, check with:

python --version

Main example: download and save a file #

Here is the full beginner-friendly version again:

import requests

url = "https://example.com/file.txt"

response = requests.get(url)
response.raise_for_status()

with open("file.txt", "wb") as file:
    file.write(response.content)

print("Download complete")

How it works #

1. Import requests #

import requests

This imports the requests package so your script can make an HTTP request.

If this line gives an error, see how to fix ModuleNotFoundError: No module named x.

2. Store the URL #

url = "https://example.com/file.txt"

Replace this with the direct URL of the file you want to download.

3. Send a GET request #

response = requests.get(url)

This asks the server for the file.

If you want to learn more about requests first, see how to make an API request in Python.

4. Check for HTTP errors #

response.raise_for_status()

This stops the program if the server returns an error such as:

  • 404 Not Found
  • 403 Forbidden
  • 500 Internal Server Error

This is better than saving a bad response without noticing.

5. Open a local file in binary write mode #

with open("file.txt", "wb") as file:

This creates a local file named file.txt in the current folder.

If you want to understand open() better, read Python open() function explained.

6. Write the downloaded content #

file.write(response.content)

response.content contains the downloaded bytes. The script writes those bytes into the file.

Why wb mode is used #

wb means write binary.

This matters because downloaded files are often not plain text. Binary mode works safely for:

  • images
  • PDFs
  • ZIP files
  • text files

Using wb helps avoid file corruption, especially for non-text files.

If you want a broader introduction to reading and writing files, see Python file handling basics: read and write.

Example with a custom filename #

You do not have to save the file with the same name as the URL. You can choose your own filename.

import requests

url = "https://example.com/file.txt"
output_file = "downloaded_file.txt"

response = requests.get(url)
response.raise_for_status()

with open(output_file, "wb") as file:
    file.write(response.content)

print(f"Saved as {output_file}")

This version:

  • uses a custom output filename
  • saves the file in the current folder
  • keeps the path simple and easy to test

Basic error handling #

A beginner script is better if it shows clear errors instead of crashing.

import requests

url = "https://example.com/file.txt"
output_file = "file.txt"

try:
    response = requests.get(url)
    response.raise_for_status()

    with open(output_file, "wb") as file:
        file.write(response.content)

    print("Download complete")

except requests.exceptions.MissingSchema:
    print("Invalid URL. Did you forget https:// ?")

except requests.exceptions.ConnectionError:
    print("Connection problem. Check your internet or the website address.")

except requests.exceptions.HTTPError as error:
    print(f"HTTP error: {error}")

except PermissionError:
    print("Permission denied. Try saving to a different folder.")

This helps handle common problems such as:

  • invalid URLs
  • connection failures
  • HTTP errors like 404
  • file permission problems

Common beginner problems #

Here are the most common issues when downloading files in Python.

requests is not installed #

You may see an error like:

ModuleNotFoundError: No module named 'requests'

Install it with:

pip install requests

The URL opens a web page instead of a file #

Sometimes the URL does not point directly to a file. It may point to a normal web page instead.

You can debug this with:

print(response.url)
print(response.headers.get("content-type"))

Example:

import requests

url = "https://example.com/file.txt"
response = requests.get(url)

print(response.status_code)
print(response.url)
print(response.headers.get("content-type"))

This helps you see:

  • the final URL after redirects
  • the status code
  • the content type returned by the server

If the content type is text/html, you may be downloading a page instead of the file you expected.

The saved file has the wrong name or extension #

Make sure your output filename matches the type of file you are downloading.

For example:

  • image data should usually be saved as .jpg or .png
  • PDF data should usually be saved as .pdf
  • ZIP files should usually be saved as .zip

The script has no permission to save the file #

If Python cannot write to the folder, you may get a permission error.

In that case:

  • save to a different folder
  • use a simpler location
  • check folder permissions

For help, see how to fix PermissionError: [Errno 13] Permission denied.

When to use this approach #

This approach is a good choice when you want:

  • a simple download script
  • basic automation
  • a clear starting point for file download tasks

It is especially useful for beginners because the code is short and easy to test.

For very large files, a streamed download is usually better because it avoids loading the whole file into memory at once.

FAQ #

Do I need requests to download a file in Python? #

No. Python can also do this with built-in modules. But requests is one of the easiest options for beginners because the code is short and readable.

Why do I use wb instead of w? #

wb writes binary data. It is safer for files like images, PDFs, and ZIP files.

What if the download URL returns an error? #

Use response.raise_for_status() and wrap the request in try/except so you can show a helpful message.

Can this download large files? #

Yes, but for very large files, a streamed download is better than loading everything into memory at once.

See also #

Press Esc to close