개발/ETC

[Python] 파이썬으로 이미지 다운로드 하기

신매력 2014. 5. 10. 17:57

아래와 같은 텍스트 파일이 있다.

파이썬으로 아래 이미지들을 다운로드해서 저장할 것이다.


앞에 숫자는 행번호이고 뒤에는 콤마로 구분된 n개의 이미지 path가 있다.

1_1.jpg, 2_1.jpg, 2_2.png, 2_3.gif, 3_1.jpg, 3_2.jpg 이런식으로 저장할 것이다. 


1,/image/img1.jpg

2,/image/img2.jpg,/image/img3.png,/image/img4.gif

3,/image/img5.jpg,/image/img6.jpg





1. 이미지 주소를 이미지파일로 다운로드 하는 함수이다.


import os

import sys

import urllib


def download_photo(img_url, filename):

    file_path = "%s%s" % ("/Users/marobiana/Documents/pythonTest/", filename)

    downloaded_image = file(file_path, "wb")


    image_on_web = urllib.urlopen(img_url)

    while True:

        buf = image_on_web.read(100000000)

        if len(buf) == 0:

            break

        downloaded_image.write(buf)


    downloaded_image.close()

    image_on_web.close()


    return file_path


# call

download_photo("http://marobiana.com/image/test.jpg", "test.jpg")


image_on_web.read(100000000) 에서 안에 들어가는 숫자는 한번에 읽어올 데이터의 사이즈이다.

숫자를 적게 하면, 이미지 하나를 불러오는데 사이즈만큼 나눠서 받아오게 된다.


img_url은 여기서 가라 주소로 사용됐음. 

어쨌든.. 저런형식으로 콜하면 test.jpg라는 이름으로 저장이 되어 있을 것이다. 

내가 지정한 file_path에.




2. 이번에는 응용을 해서, 맨 위에서 작성된 텍스트파일을 읽어서 

일괄적으로 저장하는 함수도 하나 만들어보았다.


def make_img_url():

f = file('format.txt');   # 맨 위에있는 텍스트 파일

line = f.readline();


while line:

line = line.replace("\n", "");   # 엔터마다 \n이 붙어있으므로 공백으로 치환

result = line.split(",")


i = 0;    # 파일 이름 뒤에 몇번째 이미지인지 붙이기 위한 변수 ex) 2_1.jpg

for value in result:

i += 1

if (i == 1):

result_image_name = value

print result_image_name

continue

    

extention = value.split(".")[-1]; # 확장자 추출.

                        # 1번에서 만든 함수 call

download_photo(value, "%s_%d.%s" % (result_image_name, i 1, extention))


line = f.readline();


# call

make_img_url()



- python에는 i++ 연산자가 없어서 i += 1 같이 썼다.


- extention = value.split(".")[-1]; # 확장자 추출.


만약 /image/img1.jpg 

이 값을 split했다면, 

/image/img1  과 jpg 가 배열에 들어있을 것이다.


확장자 추출을 위해 배열의 맨 마지막 값을 꺼내고 싶다면.

arr[-1] 처럼 쓰면 배열의 맨 뒤에서 첫번째 값을 가져오겠다 라는 뜻이 된다.


arr[-2] 를 쓴다면 배열의 뒤에서 두번째 것을 가져오겠다라는 뜻이 된다.


- 참고로, 탭 구분이 엄청 중요한데, 탭이 미세하게 달라지면 에러를 뱉으니..

자꾸 에러가 발생하면 탭을 모두 지웠다가 다시 띄워봐야한다.