Python 第一次用,做個記錄
import textwrap
import pymssql
from datetime import datetime, timedelta
class Data:
# 數據庫連接
server = ""
user = ""
password = ''
database = ''
list = [] # 定義列表用來存放SQL語句
def __init__(self, LogFileName):
self.LogFileName = LogFileName
# 格林時間轉北京時間
def UTCtoBJS(self, UTC):
# UTC_format = "%Y-%m-%dT%H:%M:%S.%fZ"
BJS_format = "%Y-%m-%d %H:%M:%S"
UTC = datetime.strptime(UTC, BJS_format)
# 格林威治時間+8小時變為北京時間
BJS = UTC + timedelta(hours=8)
BJS = BJS.strftime(BJS_format)
return BJS
# 批量導入數據庫
def StoreToDatabase(self):
try:
connect = pymssql.connect(self.server, self.user, self.password, self.database) # 建立連接
if connect:
print("連接成功!")
cursor = connect.cursor() # 創建一個游標對象,python里的sql語句都要通過cursor來執行
sql = '' # 循環拼接SQL
for items in self.list:
sql += textwrap.dedent(items)
cursor.execute(sql) # 執行sql語句
connect.commit() # 提交
self.list.clear() # 清空 list
cursor.close()
connect.close()
else:
print("連接失敗!")
except BaseException as ex:
print('拋出異常', ex)
def main(self):
f = open(self.LogFileName, 'r', encoding='UTF-8', errors='replace')
lines = f.readlines()
self.list.clear() # list全局變量清空
print('開始執行,打印文件名', self.LogFileName)
for line in lines:
if SourceSite in line:
array = line.split(' ', 5)
AccessDate = self.UTCtoBJS('%s %s' % (array[0], array[1])) # 時間
SystemPage = array[4][1:len(array[4])]
if 'App Store' in SystemPage:
# txt記錄一份 可直接刪除
# with open('lucky.txt', "a", encoding='UTF-8') as file: # ”w"代表着每次運行都覆蓋內容
# file.write(
# '%s %s %s %s \n' % (time, array[2], array[3], myPageURL))
sql = "INSERT dbo.ChemicalbookAccessData (AccessDate,SourceSite,SystemPage,CreateDate)VALUES(\'%s\',\'%s\',\'%s\',GETDATE());" % (
AccessDate, SourceSite, SystemPage)
self.list.append(sql) # list 存儲 SQL 每20條執行一次
if len(self.list) == 20:
self.StoreToDatabase()
print('每次導入20條數據,導入成功')
# 再來一個導入
if len(self.list) > 0:
print('再來一個導入%s條數據' % (len(self.list)))
self.StoreToDatabase()
print('最后一次導入成功')
print('------------程序結束執行---------------')
if __name__ == '__main__':
dateNow = datetime.now().strftime('u_ex%C%m%d.log') # 生成文件名
mm = ChemicalbookAccessData('D:/Projects/' + dateNow) # 直接傳路徑
mm.main()