pseudomarvin
pseudomarvin

Reputation: 1627

Write binary data from a string to a binary file

I have a torrent file obtained by using requests.get() stored in a string and obtained like this:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept-Charset': 'utf-8',
'Connection': 'keep-alive'}
request = requests.get(url, headers=headers)
data = requests.text

I would like to write it to a binary file so that the data within it are correct and it is valid:

with open(name, "wb") as f:
    f.write(data)

However I seem to not be able to write the string as pure binary data because python keeps trying to interpret it as Unicode and I get errors like: "UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-9: ordinal not in range (128).

I have attempted to use bytearray but a similar problem arises: TypeError: unicode argument without an encoding.

Is there a way to just write the bytes in the string to a file as they are?

Upvotes: 0

Views: 3997

Answers (1)

Robᵩ
Robᵩ

Reputation: 168876

  • Use response.content, not response.text.
  • Use "wb" to open the file for binary output.

Sample program:

import requests

r = requests.get("http://httpbin.org/image/png")
with open("image.png", "wb") as out_file:
    out_file.write(r.content)

A slightly fancier program with a smaller memory footprint for ginormous files:

import requests
import shutil

r = requests.get("http://httpbin.org/image/png", stream=True)
with open("image.png", "wb") as out_file:
    shutil.copyfileobj(r.raw, out_file)

Upvotes: 9

Related Questions