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()