Forum Archive

Simple file download.

NickAtNight

Trying to figure out how to simply download a file to my iPad.

I found a Python2.7 example, and modified it to this.

import urllib

filein = "https://raw.githubusercontent.com/grrrr/py/741ba0500bc49e8f6268f02d23e461649e8d457b/scripts/buffer.py"
fileout = 'readurl_test2.txt'

fin = urllib.urlopen(filein)
fout = open(fileout,'w')

fout.truncate()

bytemyfile = fin.read()
myfile = bytemyfile.decode("utf-8")

fout.write(myfile)
print myfile

fin.close()
fout.close()

For version 3, this works:

import urllib.request

filein = "https://raw.githubusercontent.com/grrrr/py/741ba0500bc49e8f6268f02d23e461649e8d457b/scripts/buffer.py"
fileout = "readurl_test3.txt"

fin = urllib.request.urlopen(filein)
fout = open(fileout,'w')

fout.truncate()

bytemyfile = fin.read()
myfile = bytemyfile.decode("utf-8")
fout.write(myfile)
print (myfile)

fin.close()
fout.close()

NickAtNight

Ok, so if I want to keep the file name, I need something like this.

filepath = 'https://raw.githubusercontent.com/grrrr/py/741ba0500bc49e8f6268f02d23e461649e8d457b/scripts/'
filename = 'buffer.py'

filein = filepath + filename
fileout = filename

lukaskollmer

You can use urllib.urlretrieve:

import urllib
urllib.urlretrieve("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

This will download the file and return a File object which points to the downloaded file on disk

NickAtNight

And I can replace the hard code with a input()

filein = input("Enter the URL address of file to get:")
fileout = input("Enter the file name:")

filein = filepath + filename
fileout = filename

NickAtNight

Ok, I will have to try that. @lukaskollmer

How about this:
If I navigate to the file in Safari.
I can run a script.
Using APPEX will give me the URL

import appex

r = appex.get_url()

print(r)

Now I just need to put that url into the command.

NickAtNight

Latest version,
- Uses APPEX.
-- If running as a script, gets the file name from APPEX.
-- So navigate to file and invoke script.
-- No checking for the appropriate type of file.
- If not run as a script
-- Allow manual entry of entire file path.
-- Alterbative is to use the dummy test url

  • I suppose I should make a 'download' directory and put the files in there, just below the root.

import console
import dialogs
import appex
import os.path
import urllib.request, urllib

test = appex.is_running_extension()

if test == True:
filein = appex.get_url()
else:
myrun = dialogs.alert('Manual entry?', '','Enter manual URL',"Dummy")
if myrun == 1:
filein = input("Enter the URL address of file to get:")

else:
    filein = "https://raw.githubusercontent.com/grrrr/py/741ba0500bc49e8f6268f02d23e461649e8d457b/scripts/buffer.py"

fileparse = urllib.parse.urlparse(filein)
filepath,filename = os.path.split(fileparse.path)

fin = urllib.request.urlopen(filein)

fout = open(filename,'w')

fout.truncate()

bytemyfile = fin.read()
myfile = bytemyfile.decode("utf-8")
fout.write(myfile)
print (myfile)

fin.close()
fout.close()

NickAtNight

Revised version.

Makes a Downliad file in Documents.
Puts download file there

import console
import dialogs
import appex
import os.path
import urllib.request, urllib

Make a downloads directory

os.chdir(os.path.expanduser('~'))
os.chdir(os.path.join(os.getcwd(),'Documents'))

test = os.path.isdir('Downloads')
print(test)

if test == False:
print('Downloads created')
os.makedirs('Downloads')
else:
print('Downloads exists')

print('Change dir to Downloads')

os.chdir(os.path.join(os.getcwd(),'Downloads'))

Test if running as extenstion

test = appex.is_running_extension()

if test == True:
filein = appex.get_url()
else:
myrun = dialogs.alert('Manual entry?', '','Enter manual URL',"Dummy")

if myrun == 1:
filein = input("Enter the URL address of file to get:")

else:
filein = "https://raw.githubusercontent.com/grrrr/py/741ba0500bc49e8f6268f02d23e461649e8d457b/scripts/buffer.py"

fileparse = urllib.parse.urlparse(filein)
filepath,filename = os.path.split(fileparse.path)

fin = urllib.request.urlopen(filein)

fout = open(filename,'w')

fout.truncate()

bytemyfile = fin.read()
myfile = bytemyfile.decode("utf-8")
fout.write(myfile)
print (myfile)

fin.close()
fout.close()

NickAtNight

Well, that works modestly well. It downloaded both sample files for this Google code jam problem.

link text

NickAtNight

Well, not working on github.com

Getting coding error

Traceback (most recent call last):
File "/private/var/mobile/Containers/Shared/AppGroup/78B1F70D-7DE8-4840-87C8-F5C1D01E9EF5/Pythonista3/Documents/LPTHW/FileDownload.py", line 49, in
fout.write(myfile)
UnicodeEncodeError: 'ascii' codec can't encode character '\xb7' in position 1367: ordinal not in range(128)

JonB

You are better off using requests than urllib. It is easier to work with, and it handles decoding of the charset for you (otherwise, you need to check what encoding the website uses, and decode based in that). Also, you are better off using 'wb' to open your file, and write the bytes directly, rather than trying to mess with encodings at all.

Here is a 2 liner to save a file:

with open(destpath,'wb') as file:
        file.write(requests.get(url).content)

See https://gist.github.com/jsbain/fcb3f42932dde9b0ff6c122893d1b230 for how this is used in an app extension that can be run from safari, to save a file to pythonista.

By the way, to post code in the forums, please type three backticks before you paste, on a separate line, and theee backticks after:

```
your code here
```

Backticks on ios are a pain, you have to long press the single quote, and select the option on the left. I like to create a keyboard shortcut in settings, which replaces ,,, with ``` for this purpose.

NickAtNight

Backticks?

Ok, let's give it a try.

Here is a simple working version of your suggestion.

I like the 'wb' switch.

import requests

print()

destpath = 'ex24file.txt'
url = "https://raw.githubusercontent.com/grrrr/py/741ba0500bc49e8f6268f02d23e461649e8d457b/scripts/buffer.py"

with open(destpath,'wb') as file:
    file.write(requests.get(url).content)
NickAtNight

Well that works pretty good @JonB.

I just learned how to transfer up a GIST.

First test:
https://gist.github.com/NickAtNight500

How do we download a ZIP file?

NickAtNight

Tagging this discussion for future reference. link text

TutorialDoctor

Found this bit of code on github inside of a game made with Pythonista.

urllib.request.urlretrieve('https://drive.google.com/uc?export=download&id=0B3zm9_2zdxHnQUJweTVtMU1GdDQ', 'notsonice.m4a')

It downloads a file from their Google Drive account into the directory the script that runs this code is.

lukaskollmer

@TutorialDoctor Isn't that basically what I already proposed?

TutorialDoctor

Eeek. Yup.

NickAtNight

So what is the difference between request and urllib.request?

Same library, just different collections?

abcabc

http://stackoverflow.com/questions/2018026/what-are-the-differences-between-the-urllib-urllib2-and-requests-module

lachlantula

@TutorialDoctor Hahaha, looks like you found my game I made as a joke between me and my friend:P