utils.py 2.63 KB
Newer Older
soumith's avatar
soumith committed
1
import os
soumith's avatar
soumith committed
2
import os.path
soumith's avatar
soumith committed
3
4
5
import hashlib
import errno

soumith's avatar
soumith committed
6

7
8
9
def check_integrity(fpath, md5):
    if not os.path.isfile(fpath):
        return False
soumith's avatar
soumith committed
10
    md5o = hashlib.md5()
soumith's avatar
soumith committed
11
    with open(fpath, 'rb') as f:
soumith's avatar
soumith committed
12
        # read in 1MB chunks
13
        for chunk in iter(lambda: f.read(1024 * 1024), b''):
soumith's avatar
soumith committed
14
15
            md5o.update(chunk)
    md5c = md5o.hexdigest()
16
17
18
19
20
    if md5c != md5:
        return False
    return True


soumith's avatar
soumith committed
21
def download_url(url, root, filename, md5):
22
23
    from six.moves import urllib

24
    root = os.path.expanduser(root)
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    fpath = os.path.join(root, filename)

    try:
        os.makedirs(root)
    except OSError as e:
        if e.errno == errno.EEXIST:
            pass
        else:
            raise

    # downloads file
    if os.path.isfile(fpath) and check_integrity(fpath, md5):
        print('Using downloaded and verified file: ' + fpath)
    else:
Tzu-Wei Huang's avatar
Tzu-Wei Huang committed
39
40
41
42
43
44
45
46
47
        try:
            print('Downloading ' + url + ' to ' + fpath)
            urllib.request.urlretrieve(url, fpath)
        except:
            if url[:5] == 'https':
                url = url.replace('https:', 'http:')
                print('Failed download. Trying https -> http instead.'
                      ' Downloading ' + url + ' to ' + fpath)
                urllib.request.urlretrieve(url, fpath)
Sanyam Kapoor's avatar
Sanyam Kapoor committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93


def list_dir(root, prefix=False):
    """List all directories at a given root

    Args:
        root (str): Path to directory whose folders need to be listed
        prefix (bool, optional): If true, prepends the path to each result, otherwise
            only returns the name of the directories found
    """
    root = os.path.expanduser(root)
    directories = list(
        filter(
            lambda p: os.path.isdir(os.path.join(root, p)),
            os.listdir(root)
        )
    )

    if prefix is True:
        directories = [os.path.join(root, d) for d in directories]

    return directories


def list_files(root, suffix, prefix=False):
    """List all files ending with a suffix at a given root

    Args:
        root (str): Path to directory whose folders need to be listed
        suffix (str or tuple): Suffix of the files to match, e.g. '.png' or ('.jpg', '.png').
            It uses the Python "str.endswith" method and is passed directly
        prefix (bool, optional): If true, prepends the path to each result, otherwise
            only returns the name of the files found
    """
    root = os.path.expanduser(root)
    files = list(
        filter(
            lambda p: os.path.isfile(os.path.join(root, p)) and p.endswith(suffix),
            os.listdir(root)
        )
    )

    if prefix is True:
        files = [os.path.join(root, d) for d in files]

    return files