CMSimple Drupal Yii 內容管理系統三方案 - 提升台灣中小企業競爭力

目前位置:   首頁 > Program Talk > auto_file_upload.py

auto_file_upload.py

這是一個自動進入圖檔目錄逐一讀取所有圖檔, 並且利用 SQLite 與 SForum 上傳檔案間的關係對應, 以程式自動處理的模式, 將目錄中的所有圖檔自動上傳到資料庫與上傳檔案目錄.

#coding: utf-8 
# 導入 glob 用來進入目錄讀取檔案
import glob
import os
import shutil
#from pybean import Store, SQLiteWriter
from PIL import Image
import sqlite3
# 聯結資料庫檔案
conn = sqlite3.connect("tree2.db")
conn.row_factory = sqlite3.Row
# 取得目前 cursor
cursor = conn.cursor()
# tree2.db 資料庫並非由 pybean 所建立, 若仍要使用 python, 必須改為 SQLite3 直接處理, 無法使用 pybean
count = 0
'''
檔案名稱特徵如下:
植物名+數字
植物名+_+數字
植物名+-+其他
'''
# 根據字元的 ASCII 號碼辨識中文字元或 ASCII 字元
def getTreeName(input):
    output = []
    植物名 = ""
    for 索引 in range(len(input)):
        if ord(input[索引]) > 255:
            output.append(input[索引])
        else:
            break
    for 索引 in range(len(output)):
        植物名 = 植物名 + output[索引]
    return 植物名
def reduceJpg(path, filename, ini_version, db_name, id, k):
    foo = Image.open(os.getcwd()+"\\"+path+"\\"+filename)
    file_ext = os.path.splitext(filename)[1][1:].strip() 
    width, height = foo.size
    reduced_width = 150
    reduced_height = int(reduced_width*height/width)
    foo = foo.resize((reduced_width, reduced_height),Image.ANTIALIAS)
    newfile_path = "v:/test/"
    # $ini_version."_".$this->database_name."_".$id."_".$k.".".$file_ext[$k];
    newfilename = str(ini_version)+"_"+str(db_name)+"_"+str(id)+"_display_"+str(k)+"."+str(file_ext)
    foo.save(newfile_path+newfilename,optimize=True,quality=95)
全部植物 = []
id1 = 0
k = 0
#treedb = Store(SQLiteWriter("tree2.db", frozen=False))
for filename in glob.glob(os.path.join('alltree', '*.jpg')):
    #print(filename)
    目錄, 檔案名 = filename.split("\\")
    檔名, 副檔名 = 檔案名.split(".")
    count = count + 1
    filesize = os.path.getsize(filename)
    print(filesize)
    if(1):
        全部植物.append(getTreeName(檔名))
        #print(getTreeName(檔名)," ", 檔名)
        # 利用 getTreeName(檔名) 進入資料庫查詢是否已經有附掛檔案
        # 若已經附掛檔案, 則查詢目前所附掛檔案個數, 以便附加於其後
        # 若尚無附掛檔案, 則由第一個檔案附掛之資料庫處理進行檔案附掛
        樹木名稱 = getTreeName(檔名)
        # 利用樹木名稱向 tree2.db 查詢是否有此資料
        #treedb = Store(SQLiteWriter("tree2.db", frozen=False))
        #try:
        sql = "SELECT id FROM sforum WHERE for_ptitle='"+樹木名稱+"'"
        cursor.execute(sql)
        來源資料 = cursor.fetchone()
        if 來源資料 != None:
            print("1:",來源資料["id"])
        #來源資料 = treedb.find_one("sforum", "for_ptitle like ?",[樹木名稱])
        # SELECT * FROM uploadfile WHERE follow='1' order by CAST(fileorder AS int) desc
            sql2 = "SELECT fileorder FROM uploadfile WHERE follow='"+str(來源資料["id"])+"' order by CAST(fileorder AS int) desc"
            cursor.execute(sql2)
            上傳檔案 = cursor.fetchone()
            if 上傳檔案 != None:
                print("2:", 上傳檔案["fileorder"])
                #上傳檔案 = treedb.find_one("uploadfile", "follow like ? order by fileorder desc",[來源資料.id])
            id1 = str(來源資料["id"])
            if 上傳檔案 != None:
                print("已經有", int(上傳檔案["fileorder"])+1, "個上傳檔案")
                k = str(int(上傳檔案["fileorder"])+1)
            else:
                # 表示沒有上傳檔案, 因此 fileorder = 0
                k = str(0)
                #print("還沒有上傳檔案")
        # 若進入這裡, 表示資料庫中已經有對應資料, 接著查詢是否有附掛檔案
        #print(來源資料.for_text)
        # 著手更新 uploadfile 中的對應欄位
        # tablename = tree.db
        # follow = id
        # version = 0.1
        # fileorder = k
        # filename = 檔名
            # filesize 欄位 = filesize
            #print(filesize)
            # 以下等同是在 uploadfile 資料表中新增資料
            # insert some data
            cursor.execute("INSERT INTO uploadfile(tablename, follow, version, fileorder, \
       filename, filesize) VALUES('tree.db','"+id1+"','0.1','"+k+"','"+檔案名+"','"+str(filesize)+"')")
            # 將資料存入資料庫檔案
            conn.commit()
            ini_version1 = "0.1"
            print(ini_version1)
            db_name1 = "tree.db"
            #id = "對應的樹木 id 編號"
            #k = "對應的 file order 編號"
            # 先處理大圖檔改名
            樹木大圖名稱 = str(ini_version1)+"_"+str(db_name1)+"_"+str(id1)+"_"+str(k)+"."+str(副檔名)
            print(樹木大圖名稱)
            shutil.copyfile(os.getcwd()+"\\alltree\\"+檔名+"."+副檔名, "V:\\test\\"+樹木大圖名稱)
            樹木小圖名稱 = ini_version1+"_"+db_name1+"_"+id1+"_display_"+k+"."+副檔名
            # 再產生對應的小圖檔案
            reduceJpg("alltree", 檔名+"."+副檔名, "0.1", "tree.db", id1, k)
        else:
            # 表示根本無法查得對應資料?
            print("查無此資料")
            # 先在 sforum 資料表中增加此筆資料, 然後再將檔案附加為上傳檔案 (新增 uploadfile 資料表中的資料)
            # 以下等同是在 sforum 資料表中新增資料
            # insert 樹木資料 into sforum 資料表
            for_data = "2013 02 07 11:09:48"
            for_ip = "127.0.0.1"
            for_name = "Guest"
            cursor.execute("INSERT INTO sforum(wid, for_ptitle, for_text, for_data, for_dataw, \
       for_ip, for_name) VALUES(' ','"+樹木名稱+"','"+樹木名稱+"','"+for_data+"','"+for_data+"','"+for_ip+"','"+for_name+"')")
            # 將資料存入資料庫檔案
            conn.commit()
            # 處理 wid 更新為 id 的流程
            sql = "SELECT id FROM sforum WHERE for_ptitle='"+樹木名稱+"'"
            cursor.execute(sql)
            來源資料 = cursor.fetchone()
            wid = 來源資料["id"]
            id1 = 來源資料["id"]
            sql = """
            UPDATE sforum
            SET wid = '"""+str(wid)+"""' 
            WHERE for_ptitle = '"""+str(樹木名稱)+"""'
            """
            # 值型資料庫更新
            cursor.execute(sql)
            conn.commit()
            # insert uploadfile data into uploadfile 資料表
            # 由於若進入這裡, 都是新增檔案, 因此 k=0
            k = 0
            cursor.execute("INSERT INTO uploadfile(tablename, follow, version, fileorder, \
       filename, filesize) VALUES('tree.db','"+str(id1)+"','0.1','"+str(k)+"','"+str(檔案名)+"','"+str(filesize)+"')")
            # 將資料存入資料庫檔案
            conn.commit()
        ini_version1 = "0.1"
        db_name1 = "tree.db"
        #id = "對應的樹木 id 編號"
        #k = "對應的 file order 編號"
        # 先處理大圖檔改名
        樹木大圖名稱 = str(ini_version1)+"_"+str(db_name1)+"_"+str(id1)+"_"+str(k)+"."+str(副檔名)
        shutil.copyfile(os.getcwd()+"\\alltree\\"+檔名+"."+副檔名, "V:\\test\\"+樹木大圖名稱)
        樹木小圖名稱 = str(ini_version1)+"_"+str(db_name1)+"_"+str(id1)+"_display_"+str(k)+"."+str(副檔名)
        # 再產生對應的小圖檔案
        reduceJpg("alltree", 檔名+"."+副檔名, "0.1", "tree.db", id1, k)
    else:
        break
# 利用 set 去除重複內容
全部植物 = list(set(全部植物))
# 共有 1302 種不同植物
print("共有", len(全部植物),"種植物")

 

 

Powered by CMSimple_XH| Template: ge-webdesign.de| 登入