jiahaohappy 2020-06-21
总公司的某数据以文件形式存放在FTP服务器上,现将其移植到我本地的SQL服务器。
我已有连接pyodbc
import pyodbc import pandas as pd from ftplib import FTP import sqlalchemy ip=‘XXX.XXX.XXX.XXX‘ port=21 username=‘XXX‘ password=‘XXXXX‘ ftp=FTP() ftp.connect(ip,port) ftp.login(username,password) ftp.cwd(‘./cds‘) #进入到我的子目录 buffersize=1024 filename=‘3407_20200101_20200607.unl‘ try: with open(filename,‘rb‘) as fp: ftp.retrbinary(‘RETR %s‘%os.path.basename(filname), fp.write,buffersize) except: pass ftp.quit() #由于informix生成的unl文件为cp936编码,pandas 读取时会对有些汉字报错,所以转为utf-8 with open(filename,‘r‘,encoding=‘cp936‘) as fp1,open(‘_temp.txt‘,‘w‘,encoding=‘utf-8‘) as fp2: fp2.write(fp1.read()) #本地为SQLServer+pyodbc,并已经建立了ODBC-DSN ,下面为关键代码 engine = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@<dsnname>") #对_tmp.txt 文件读取时,要注意纯数字的(编码、ID等等)格式转换(可直接转换成object), #否则Pandas会自动转换为float或bigint df=pd.read_csv(‘_temp.txt‘,sep=‘|‘,header=None,dtype={5:object,7:object}) #(我的数据文件无列名,第5和7列为数值型文本,从第0列开始) #最后一列为空,drop掉 df=df.drop(28,axis=1) #增加列名,title为列名list title=[‘‘,‘‘,‘‘,...] df.columns=title # 写pandas 的 DataFrame 到SQLServer的一个表 df.to_sql("table_name", engine,index=False) #这样建立的表实质上数据类型与我的预期是不符的 #通过已建立符合预期的结构表来改变类型 with engine.connect() as con: con.execute(‘DROP TABLE if exists table_name‘) con.execute(‘CREATE TABLE table_name LIKE table_example;‘) df.to_sql(table_name, engine, index=False, if_exists=‘append‘) #至此,完美!
计算的时候总共分3步,1到2是第二组......lower: i. 这组数据中的小值 higher: j. 这组数据中的大值,fraction 是第三步中的小数部分,意思是当前这组数据的0到1的分位数
Series是一种类似于一维数组的对象,由一组数据以及一组与之对应的索引组成。 index: 索引序列,必须是唯一的,且与数据的长度相同. 如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引