#4 전자액자 프로젝트 - 랜덤 파일 액세스

2022. 3. 19. 03:10IT

나의 사진들은 NAS 서버에 저장이 되어 있고 RAW로 찍어서 용량이 꽤나 크다. 그리고 동시에 JPG로 저장을 해 놨기 때문에 파일의 개수가 상당히 많다. RAW만 찍은 파일들은 대부분 JPG로 변환을 해 놓았기 때문에 JPG나 jpg 파일만 읽어서 화면에 보이도록 할 것이다.

 

다음의 소스코드는 두 가지를 테스트한 코드이다. 

첫번째는 파일을 읽어서 텍스트 파일에 저장을 하고 랜덤 함수를 이용해서 파일명을 출력하는 것이고 두번째는 저장을 데이터베이스에 한다는 것만 다르다. 

 

내가 가진 파일의 개수가 5만개가 되기 때문에 속도 측면에서 뭐가 유리할지 몰라서 두가지를 테스트 했다. 두가지 모두 큰 차이가 없다. 파일은 NAS 서버에 그때 그때 추가될 수 있으니 프로그램 시작을 할 때에 매번 스캔을 하도록 하려고 한다. 

 

선택은 만드는 사람이 하면되겠다. 

나는 개인적으로 텍스트 파일을 이용하도록 해 보려고 한다. 

 

초보들께서는 파일 경로만 주의하면 될 것 같다. 난 Mac에서 작업을 해서 경로가 아래와 같은데 만일 Windows PC에서 테스트를 하고 있다면 C:\\Volume\\Photo와 같이 경로를 정해주면 되겠다.

 

import os
import datetime
import sqlite3
import random
from time import sleep

###########################################################################
# 파일 스캔 후, 텍스트 파일에 저장
now = datetime.datetime.now()
cnt = 0
f = open('./photolist', 'a')
for root, dirs, files in os.walk("/Volumes/Photo/Original"):
    for file in files:
        if file.endswith(".JPG") or file.endswith(".jpg"):
             #print(os.path.join(root, file))
             f.write(os.path.join(root, file) + '\n')
             cnt += 1
f.close()
print(f"File count = {cnt}")
end = datetime.datetime.now()


############################################################################
# 파일 스캔 후, 데이터베이스에 저장
now1 = datetime.datetime.now()
_con = sqlite3.connect("photo.db", detect_types=sqlite3.PARSE_DECLTYPES)
db = _con.cursor()
sql = "CREATE TABLE album (idx INTEGER PRIMARY KEY, name TEXT)"
db.execute(sql)
for root, dirs, files in os.walk("/Volumes/Photo/Original"):
    for file in files:
        if file.endswith(".JPG") or file.endswith(".jpg"):
             #print(os.path.join(root, file))
             sql = "INSERT INTO album (name) VALUES(?)"
             _con.execute(sql, (os.path.join(root, file),))


end1 = datetime.datetime.now()
print(f"[TextFile]File scan operation and make a file list took : {end-now}")
print(f"[DB]File scan operation and make a file list took : {end1-now1}")

sql = "select count(name) from album"
db.execute(sql)
rows = db.fetchall()
x = rows[0]
print(x[0])

#randint(a, b)
#randint 함수는 인자로 들어온 a, b 사이의 랜덤한 정수(int)를 반환합니다.
#반환하는 x는  a, b를 포함한 범위 입니다. (a <= N <= b)
#randrange 함수에 a, b+1을 넣은것과 동일하게 동작합니다.
for i in range(10):
    index = random.randint(1, int(x[0]))
    print(f"[{i}] [DB] random index number = {index}")
    sql = "select name from album where idx = ?"
    db.execute(sql, (index,))
    rows = db.fetchall()
    y = rows[0]
    print(f"filename is {y[0]}")
    sleep(3)


for i in range(10):
    index = random.randint(1, int(x[0]))
    print(f"[{i}] [Txt] random index number = {index}")
    with open("photolist") as f:
        data = f.readlines()[index]
    print(f"filename is {data}")
    sleep(3)
반응형