반응형

아이폰 이미지 이름 변경 결과

아이폰 이미지 같은 경우 사진을 백업하게 되면 아래와 같이 IMG_<숫자>.JPG 형식의 이미지가 저장됩니다.

따라서 이 사진이 언제 찍은지 알 수가 없어 사진을 제3의 백업 장소에 백업해서 정리하는 사람에게는 대략 난감한 상황이 아닐 수 없습니다.

저도 몇년치를 몰아서 한꺼번에 백업하려고 하니까 아이폰 사진을 저장하는게 제일 난감하더라구요...

저는 이러한 문제를 Exifread 라는 파이썬 모듈을 사용하여 해결하였습니다.

유용하겠다 생각하여 해결한 한 방법을 공유 드립니다!^^

아이폰 이미지 원본

 

윈도우 기준으로 이미지가 언제 찍혔는지 보는 방법은 사진 파일을 오른쪽 클릭 -> 자세히 -> 원본 에서 확인이 가능합니다.

이 사진은 2016년 08월 30일 오전 10:44에 찍혔네요

이미지 속성

 

아래는 파이썬의 exifread 모듈을 사용해서 해결한 소스코드의 일부분 입니다.

소스코드에도 보이겠지만 사진 파일을 바탕화면 하위에 "1212"라는 폴더에 저장했고

사진 파일 명은 IMG_6066.JPG 입니다.

이미지 변경 python 소스코드

 

그리고 나서 실행만 하면 아래와 같이 사진 이름이 변경되었다는 출력결과가 나옵니다.

실행 결과

 

실제로 해당 폴더에 들어가서 확인해보니 사진 이름이 잘 변경되어 있습니다.

 

아이폰 이미지 이름 변경 결과

 

여러분도 저와 같은 어려움을 겪으셨다면 Python 프로그래밍으로 어려움을 해결하시길 바라겠습니다.

 

아래 소스코드는 위에서 소개해드렸던 소스코드 공유드립니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 반드시 실행 전 pycharm을 관리자 권한으로 실행할 것!
import os
import exifread
 
image_folder_path = '<사진 저장 폴더>'
image_nm = '<사진이름>'
image_abspath = image_folder_path + '\\' + image_nm
print('원본이름: ' + image_nm)
 
# 파일 확장자
ext_idx = image_nm.find('.')
ext = image_nm[ext_idx:]
 
# 사진 파일에서 생성 날짜 메타 데이터 정보 추출할 수 있는 경우
= open(image_abspath, "rb")
tags = exifread.process_file(f)
timedata = str(tags['EXIF DateTimeOriginal'])
f.close()
 
# 변경할 이름 (데이터 파싱)
timedata = timedata.replace(':''')
fname = timedata.replace(' ''_')
 
# 확장자 붙이기
fname = fname + ext
print('변경이름: ' + fname)
 
# 파일 이름 변경
file_oldname = os.path.join(image_folder_path, image_nm)
file_newname = os.path.join(image_folder_path, fname)
os.rename(file_oldname, file_newname)
print('---변경 완료---')
 
cs

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

caul334@gmail.com

 

 

반응형
반응형

사진과 동영상 파일을 정리하다 보면 종종 파일 이름이 타임스탬프 형식으로 된 파일이 있습니다.

ex) IMG_1406204196.JPG

 

타임스탬프 형식 이름의 파일이 한 개면 온라인으로 타임스탬프를 시간 형식으로 검색하여 바꾸는 사이트에서 바꾸면 되지만 파일이 여러개일 때에는 프로그래밍을 이용하여 바꾸는게 효율적인 방법이여서 해당 방법 공유드립니다.

 

필요하신분은 아래 코드를 수정하여 사용하시면 됩니다.

 

  코드 로직 설명

1. 파일 이름이 예를 들어 "IMG_1406204196.JPG" 인 경우 정규표현식으로 Timestamp 형식의 문자열을 찾습니다.

2. 프로그램은 파일 이름 중 Timestamp 형식인 1406204196 부분을 찾습니다.

3. 찾은 1406204196 부분을 datetime 모듈을 사용하여 날짜_시간 형식으로 변경합니다.

4. 날짜_시간 형식으로 변경한 결과 20140724_211636 이라는 결과가 반영됩니다.

 

위 코드를 실행하는 경우 아래 사진과 같은 결과를 얻을 수 있습니다.

결론적으로 IMG_1406204196.JPG => 20140724_211636.JPG 로 파일 이름이 변경됩니다.

실행 결과

 

필요하신 분은 아래 소스코드를 복사할 수 있게 해놓았으니

자유롭게 사용하시면 됩니다.

 

  파이썬 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from datetime import datetime
import re
 
# 이미지 이름
image_nm = 'IMG_1406204196.JPG'        # 변경 전 파일명
 
# 파일 확장자 정보
ext_idx = image_nm.find('.')
ext = image_nm[ext_idx:]
 
# 파일 이름 내에 타임스탬프(timestamp) 형식 찾기
timestamp_pat = re.compile('1[0-7]{1}[0-9]{8}')
pat_match = timestamp_pat.findall(image_nm)
print(pat_match)    # 변경 전 타임스탬프
 
if len(pat_match) > 0:
    ut = int(pat_match[0])
    dt = datetime.fromtimestamp(ut).strftime('%Y%m%d_%H%M%S')
    print(dt)        # 변경 후 날짜_시간 형식
    print(dt+ext)    # 변경 후 파일명
cs

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

caul334@gmail.com

 

 

반응형
반응형

파이참(PyCharm)에 있는 pymysql 모듈을 통해 처음으로 MySQL을 사용하면 아래와 같이 에러가 발생할 수 있습니다.

저와 같이 에러가 나시는 분들은 아래 해결책을 통해 해결하시면 됩니다.

저의 경우는 에러메시지<1> 증상이 나타난후 곧바로 에러메시지<2> 증상이 나타났습니다.

 

 

  에러메시지<1>

RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods

 

  해결책<1>

- cryptography 모듈 설치

명령어 : python.exe -m pip install cryptography 또는 PyCharm > Setting > cryptography 모듈 설치

 

  에러메시지<2>

pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")

 

  해결책 <2>

- root 계정 접속 후 root 패스워드 변경

명령어 : ALTER USER 'root'@'localhost' IDENTIFIED BY '<바꿀패스워드>';

 

 

위와 같이 두 가지 에러메시지를 해결하면 다음과 같이 정상적으로 실행이 가능합니다.

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

caul334@gmail.com

 

 

 

반응형
반응형

zipfile 모듈을 사용하면서 압축을 다 해제하고 zipfile을 삭제하려고 하는데 에러가 발생했습니다.

 

  에러메시지

1
PermissionError: [WinError 32] 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다.
cs

 

 

  해결책

.close()로 종료했어야 했는데 종료하지 않은 객체가 있는지 확인해 봅니다.

객체를 정상적으로 종료하면 아래와 같이 해결 가능합니다.

 

1. 삭제하려는 파일

 

2. 에러메시지

 

3. close() 추가

 

반응형
반응형

트렌드를 파악하기 위해 네이버에서 데이터랩에서 제공하는 API 중 하나인 쇼핑 인사이트 API를 사용해보았습니다.

막상 사용하려 소스코드를 확인해보니 requests 모듈이 아닌 urllib 모듈이여서 사용하기 난감했습니다.

제가 평소에 requests 모듈에 친숙해 있기 때문이였죠. (requests 모듈은 알아두면 두고두고 쓸데가 많습니다.)

그래서 추후에 또 사용할 수도 있어서 이번 기회를 통해 urllib에서 requests 모듈로 변경해서 사용해보자고 생각했습니다.

 

  원본 소스코드

#-*- coding: utf-8 -*-
import os
import sys
import urllib.request
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
url = "https://openapi.naver.com/v1/datalab/shopping/categories";
body = "{\"startDate\":\"2017-08-01\",\"endDate\":\"2017-09-30\",\"timeUnit\":\"month\",\"category\":[{\"name\":\"패션의류\",\"param\":[\"50000000\"]},{\"name\":\"화장품/미용\",\"param\":[\"50000002\"]}],\"device\":\"pc\",\"ages\":[\"20\",\"30\"],\"gender\":\"f\"}";

request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
request.add_header("Content-Type","application/json")
response = urllib.request.urlopen(request, data=body.encode("utf-8"))
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)

 

API에 대한 사용방법 등 상세한 설명은 아래 링크로 달아두었습니다.

쇼핑인사이트 API 사용법

 

쇼핑인사이트 - Datalab

쇼핑인사이트 쇼핑인사이트 개요 개요 쇼핑인사이트 API 개요 쇼핑인사이트 API는 네이버 데이터랩의 쇼핑인사이트를 API로 실행할 수 있게 하는 RESTful API입니다. 네이버 통합검색의 쇼핑 영역과

developers.naver.com

 

 

  수정된 소스코드 (requests 모듈)

import requests
import json
import pprint

####################################
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
####################################

url = "https://openapi.naver.com/v1/datalab/shopping/categories"

payload = {"startDate": "2017-08-01",
           "endDate": "2017-09-30",
           "timeUnit": "month",
           "category": [
               {"name": "패션의류",
                "param": ["50000000"]},
               {"name": "화장품/미용",
                "param": ["50000002"]}],
           "device": "pc",
           "ages": ["20", "30"],
           "gender": "f"}

headers = {"X-Naver-Client-Id": client_id, "X-Naver-Client-Secret": client_secret, "Content-Type": "application/json"}
res = requests.post(url, data=json.dumps(payload), headers=headers)

print(res.status_code)
aaa = json.loads(res.text)
pprint.pprint(aaa)

 

  소스코드 실행 결과 (requests 모듈)

위 소스를 실행하면 아래와 같은 가독성 있는 결과를 얻을 수 있습니다.

 

내용이 유용하셨나요? 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

caul334@gmail.com

반응형

+ Recent posts