时间:2021-07-01 10:21:17 帮助过:27人阅读
我已有连接pyodbc
1 import pyodbc 2 import pandas as pd 3 from ftplib import FTP 4 import sqlalchemy 5 6 ip=‘XXX.XXX.XXX.XXX‘ 7 port=21 8 username=‘XXX‘ 9 password=‘XXXXX‘ 10 ftp=FTP() 11 ftp.connect(ip,port) 12 ftp.login(username,password) 13 ftp.cwd(‘./cds‘) #进入到我的子目录 14 buffersize=1024 15 filename=‘3407_20200101_20200607.unl‘ 16 try: 17 with open(filename,‘rb‘) as fp: 18 ftp.retrbinary(‘RETR %s‘%os.path.basename(filname), fp.write,buffersize) 19 except: 20 pass 21 ftp.quit() 22 #由于informix生成的unl文件为cp936编码,pandas 读取时会对有些汉字报错,所以转为utf-8 23 with open(filename,‘r‘,encoding=‘cp936‘) as fp1,open(‘_temp.txt‘,‘w‘,encoding=‘utf-8‘) as fp2: 24 fp2.write(fp1.read()) 25 26 #本地为SQLServer+pyodbc,并已经建立了ODBC-DSN ,下面为关键代码 27 engine = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@<dsnname>") 28 29 #对_tmp.txt 文件读取时,要注意纯数字的(编码、ID等等)格式转换(可直接转换成object), 30 31 #否则Pandas会自动转换为float或bigint 32 33 df=pd.read_csv(‘_temp.txt‘,sep=‘|‘,header=None,dtype={5:object,7:object}) 34 35 #(我的数据文件无列名,第5和7列为数值型文本,从第0列开始) 36 #最后一列为空,drop掉 37 df=df.drop(28,axis=1) 38 #增加列名,title为列名list 39 title=[‘‘,‘‘,‘‘,...] 40 df.columns=title 41 42 # 写pandas 的 DataFrame 到SQLServer的一个表 43 df.to_sql("table_name", engine,index=False) 44 45 #这样建立的表实质上数据类型与我的预期是不符的 46 #通过已建立符合预期的结构表来改变类型 47 with engine.connect() as con: 48 con.execute(‘DROP TABLE if exists table_name‘) 49 con.execute(‘CREATE TABLE table_name LIKE table_example;‘) 50 51 df.to_sql(table_name, engine, index=False, if_exists=‘append‘) 52 53 #至此,完美!
使用PYODBC将数据从Pandas的DataFrame写入SQL Server
标签:axis cep cut rsize buffers serve 服务器 ase 数字