人生的第一个Python脚本

花费了两天的时间,利用了百度大法,终于东拼西凑地完成了人生的第一个Python脚本,虽然还有部分语句不太理解,但毕竟实现了我的需求:

腾讯mta系统会将程序的埋点数据,也就是用户的行为,上传到ftp服务器。脚本需要从ftp服务器中下载过去24小时的数据文件(每天早上9点半执行,需要crontab执行自动任务),由于数据文件是tar.gz的压缩文件,所以需要利用tarfile库解压到本地,然后打开里面的text文件,利用json解析成字典文件,写成记录送到mysql数据库中。完成数据库的插入记录后,需要删除本地的text和tar.gz压缩文件。所以一共有这些小功能:

得到一个数列:昨天10点到今天9点,比如20190923_10,20190923_11……20190924_08,20190924_09,因为我们只需要下载这些前缀的压缩文件

连接FTP数据库,并下载指定的压缩文件

解压缩tar.gz文件,读取里面的text文件,利用json解析得出记录

连接mysql数据库,利用SQL代码插入生成的记录

删除文件夹中临时下载的tar.gz文件和text文件

好了下面上代码:

import os
import time
import json
from ftplib import FTP
import tarfile
import os.path
import pymysql
import io
import datetime

get hour list from yesterday 10 am. to today 9 am.

str_hour=[]
yesterday=datetime.date.today() + datetime.timedelta(-1)
today=datetime.date.today()
for i in range (10,24):
str_hour.append(yesterday.strftime("%Y%m%d")+"_"+str(i))
for i in range (0,10):
str_hour.append(today.strftime("%Y%m%d")+"_0"+str(i))

ftp_host='***'
ftp_port=****
ftp_username='****'
ftp_password='****'
ftp_remote_path='/mta/'

mysql_host='****'
mysql_username=***
mysql_password='***'
mysql_database='cardata'

ftp=FTP()
ftp.connect(ftp_host,ftp_port)
ftp.login(ftp_username,ftp_password)
ftp.cwd(ftp_remote_path)

print(ftp.welcome)
mta=[]
for hour in str_hour:
for filename in ftp.nlst():
if hour in filename:
mta.append(filename)

for filename in mta:
local_filename=os.path.join(os.getcwd(),filename)
with open(local_filename,'wb') as f:
print('downloading {}…'.format(filename))
ftp.retrbinary('RETR %s' % filename,f.write)

connect mysql database

mysql_conn=pymysql.connect(
host=mysql_host,
user=mysql_username,
password=mysql_password,
database=mysql_database,
charset="utf8")
cursor=mysql_conn.cursor(cursor=pymysql.cursors.DictCursor)

decompress downloaded files

current_path=os.getcwd()
downloaded_file=[filename for filename in os.listdir(current_path) if "tar" in filename]

for filename in downloaded_file:
print(filename)
#get start 10 charactes from compressed file name
record_date=filename[:8]
record_time=filename[:11]
#print(record_id)
tar=tarfile.open(filename)
names=tar.getnames()
for name in names:
tar.extract(name)
for line in io.open(name,'r',encoding='utf-8'):
sql="""
INSERT INTO mta (record_date,record_time,platform,datetime_client,page_id,operation,device_id,department,account_id,device_type,operation_id,ui,mc,ts,idx,cui,id,ei,du,av,ch) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);
"""
data=[record_date,
record_time,
json.loads(line)['kv']['platform'],
json.loads(line)['kv']['datetime_client'],
json.loads(line)['kv']['page_id'],
json.loads(line)['kv']['operation'],
json.loads(line)['kv']['device_id'],
json.loads(line)['kv']['department'],
json.loads(line)['kv']['account_id'],
json.loads(line)['kv']['device_type'],
json.loads(line)['kv']['operation_id'],
json.loads(line)['ui'],
json.loads(line)['mc'],
json.loads(line)['ts'],
json.loads(line)['idx'],
json.loads(line)['cui'],
json.loads(line)['id'],
json.loads(line)['ei'],
json.loads(line)['du'],
json.loads(line)['av'],
json.loads(line)['ch']]
cursor.execute(sql,data)
mysql_conn.commit()
os.remove(name)
tar.close()
os.remove(filename)

close mysql connection

cursor.close()
mysql_conn.close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值