需求得到天眼查的法人信息数据导入到数据库中,经过多次不断试错最后使用Python导入
先上代码
import pandas as pd
import sqlalchemy as sqla
import os
# 读取Excel数据
def getexcel(filename):
# 表头和子段映射关系
column_dic = {'公司名称': 'company_name', '经营状态': 'business_status', '法定代表人': 'legal_representative',
'注册资本': 'registered_capital',
'实缴资本': 'paid_up_capital', '成立日期': 'date_of_establishment', '核准日期': 'approval_date',
'所属省份': 'province',
'所属城市': 'city', '所属区县': 'districts_and_counties', '统一社会信用代码': 'unified_social_credit_code',
'纳税人识别号': 'taxpayer_identification_number', '注册号': 'registration_number',
'组织机构代码': 'organization_code',
'参保人数': 'number_of_participants', '公司类型': 'type_of_company', '所属行业': 'industry', '曾用名': 'former_name',
'注册地址': 'registered_address', '最新年报地址': 'the_latest_annual_report_address', '网址': 'url',
'电话': 'telephone', '邮箱': 'mail', '其他邮箱': 'other_mailboxes', '经营范围': 'business_scope',
'可用电话\n号码正常,可联系': 'telephone', '其他电话': 'other_phone', '其他号码\n未成功检测号码,或固话,或非大陆号码': 'other_phone',
'不可用电话\n空号、停机、沉默号、风险号,或同企业电话数量过多,建议跳过': 'unavailable_telephone', }
# 读取文件,跳过前两行
df = pd.read_excel(filename, skiprows=2)
# 字段间的映射转换,Excel中的表头和数据库表中字段的映射
data = {}
for i in df.columns:
if i in column_dic:
data[i] = column_dic[i]
df.rename(columns=data, inplace=True)
return df
# 获取数据库连接
def getCon():
return sqla.create_engine("postgresql+psycopg2://etl_user用户名:etl_user密码@172.16.xx.xxIP/xxxx数据库")
# 递归读取文件夹的所有文件
def readFile(rootdir):
db = getCon()
list = os.listdir(rootdir)
for i in range(0, len(list)):
path = os.path.join(rootdir, list[i])
if os.path.isdir(path):
readFile(path)
elif os.path.isfile(path):
try:
# 输出读取的文件路径
print(path)
# 获取数据
df = getexcel(path)
# 写入数据库
df.to_sql('md_corporate_information_all', db, index=False, if_exists='append')
except Exception as e:
print('异常数据:' + path + ', 错误日志:' + e)
else:
print('其他:' + path)
if __name__ == '__main__':
readFile('E:\天眼查')
( 运行程序报错导入对应依赖 )
遇到问题:
得到的文件有5000多个(手工导几乎不可能)
1,excel中的前两行为空,在读取的时候跳过两行
2,excel中列有多种24列,25列,26列都有,但表头都是一样的
3,文件太多,只能使用单线程导入,java使用多线程出现内存溢出
几个示例:
感悟: 数据处理学会使用Python事半功倍,开始尝试使用Java,Kettle等其他工具,总是出现各种问题,换用Python后一次成功