记录python读取ftp记录并入数据库。保存一些常用方法,分享给大家。
from ftplib import FTP
def ftpconnect(host, username, password):
ftp = FTP()
# ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect(host, 21) # 连接
ftp.login(username, password) # 登录,如果匿名登录则用空串代替即可
return ftp
def downloadfile(ftp, filename, localpath):
bufsize = 1024 # 设置缓冲块大小
fp = open(localpath, "wb") # 以写模式在本地打开文件
ftp.retrbinary(
"RETR " + filename, fp.write, bufsize
) # 接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) # 关闭调试
fp.close() # 关闭文件
def listfile(ftp, remotepath, downfile, curr=None):
list = ftp.nlst() # 获取目录下的文件,获得目录列表
curr = datetime.now() if curr is None else curr
filelist = []
for name in list:
if name == "." or name == "..":
continue
mdtm = ftp.voidcmd("MDTM " + remotepath + name)
mdate = mdtm[4:18].strip() # 修改日期
mdate = parser.parse(mdate) # 转为日期格式
ename = name.encode("ISO-8859-1").decode("GBK")
if downfile not in ename:
continue
filelist.append([name, ename])
return filelist
import pandas as pd
df = pd.read_csv(path + file
,sep=',' #指定逗号为分隔符
,header=0 #指定第一行为表头
,usecols=["lsh"] #指定列
,engine='python'
,encoding = 'gb18030' #指定编码 utf-8
)
pd.DataFrame(data)
.to_excel(path, sheet_name=sheetname, index=False)
from sqlalchemy import create_engine
engine=create_engine("mysql+pymysql://user:[email protected]:3306/dbbase")
"""
eg : sql = "select * from system_hmbq where hmbq = 52"
"""
df = pd.read_sql(sql, con=engine)
#入库数据库
df.to_sql(
name=table_name, #表名
con=engine, #驱动
if_exists="replace", #当数据库中已经存在数据表时对数据表的操作,有replace替换、append追加,fail则当表存在时提示ValueError
index=False, #对DataFrame的index索引的处理,=True时索引也将作为数据写入数据表
chunksize=1000 #整数,一次写入数据时的数据行数量
)
import pymysql
conn = pymysql.connect(
host="192.168.1.1", user="user", password="123", database="db"
)
#入库
sql = (
"insert into dbtable("
"s_id"
") values(%s)"
"ON DUPLICATE key UPDATE s_id=values(s_id)"
)
cur = conn.cursor()
cur.executemany(sql, rows)
conn.commit()
cur.close()
conn.close()
with conn.cursor() as cur:
sql = "select * \
from dbo.tablename where sdate= %s"
cur.execute(sql,(sdate,))
result=[]
for row in cur:
result.append([row[0]])
return result
用于填充数据表中元素为空的部分,value是填充进去的值,value缺省默认为0,这个功能建立了一个新的数据表
import pandas as pd
data=[i for i in range(1,6)]
date=['a','b',None,'d','e']
datc=['A','B','C','D',None]
df=pd.DataFrame({'one':data,'two':date,'three':datc})#创建DataFrame
print(df)#原数据表
#输出:
# one two three
# 0 1 a A
# 1 2 b B
# 2 3 None C
# 3 4 d D
# 4 5 e None
dk=df.fillna(value=0)#将0填充后的数据表
print(dk)
# 输出:
# one two three
# 0 1 a A
# 1 2 b B
# 2 3 0 C
# 3 4 d D
# 4 5 e 0
对单列进行填充,也是value缺省时默认为0
dk=df\['two'\].fillna(value=1)#将1填充后的数据表
print(dk)
# 输出:只输出一列
# 0 a
# 1 b
# 2 1
# 3 d
# 4 e
一般处理缺失值的时候可以把平均值填充进去
下面是数据表某一列的平均值
import pandas as pd
data=[10,11,22,None,44]
date=[12,13,14,None,15]
datc=[88,99,None,66,55]
df=pd.DataFrame({'one':data,'two':date,'three':datc})#创建DataFrame
print(df['two'])
#原先的two列:
# 0 12.0
# 1 13.0
# 2 14.0
# 3 NaN
# 4 15.0
# Name: two, dtype: float64
dk=df['two'].fillna(value=df['two'].mean())#two列平均值为13.5
print(dk)
# 现在的two列:
# 0 12.0
# 1 13.0
# 2 14.0
# 3 13.5
# 4 15.0
# Name: two, dtype: float64
### map():pandas series的一个方法,将一个函数运用到series的所有元素中
map(str.lower)可以将元素小写
你可用map()将str中的功能尽你所能的运用到pandas中
### str.strip:字符串中的操作方法,用于删除开头和结尾中的空白字符(空格,换行符,制表符)
import pandas as pd
# 创建一个示例DataFrame
data = {
'city': [' New York ', ' Los Angeles ', ' Chicago ', ' San Francisco ', ' Houston ']
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 原始DataFrame:
# city
# 0 New York
# 1 Los Angeles
# 2 Chicago
# 3 San Francisco
# 4 Houston
# 使用map和str.strip去除前后空白字符
df['city'] = df['city'].map(str.strip)
print("处理后的DataFrame:")
print(df)
# city
# 0 New York
# 1 Los Angeles
# 2 Chicago
# 3 San Francisco
# 4 Houston
将dataframe中的元素进行类型转换
import pandas as pd
# 创建一个示例DataFrame
data=[1.0,2.5,3.6]
date=[1.6,1.9,1.8]
datr=[1.4,1.3,2.6]
df=pd.DataFrame({'one':data,'two':date,'three':datr})
print(df)
# 原数据表
# one two three
# 0 1.0 1.6 1.4
# 1 2.5 1.9 1.3
# 2 3.6 1.8 2.6
dk=df.astype(int)
print(dk)
# 现数据表
# one two three
# 0 1 1 1
# 1 2 1 1
# 2 3 1 2
### applymap(类型)也可以实现类型的转换,只不过applymap()针对的是元素,无法对某一列进行数值转换
### 用字典可以对多列进行类型转换
import pandas as pd
# 创建一个示例DataFrame
data=[1.0,2.5,3.6]
date=[1.6,1.9,1.8]
datr=[1.4,1.3,2.6]
df=pd.DataFrame({'one':data,'two':date,'three':datr})
dic={'one':'int','two':'int'}
dk=df.astype(dic)
print(dk)
# 输出
# one two three
# 0 1 1 1.4
# 1 2 1 1.3
# 2 3 1 2.6
### df.rename(index={'前行标签名':'后行标签名'},inplace=False)
### df.rename(index={'前列索引名':'后列索引名'},inplace=False)
如果前名不在数据表中,不会发生任何变化,inplace默认为False,inplace=True时允许改变出现
import pandas as pd
# 创建一个简单的DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
}, index=['x', 'y', 'z'])
print(df)
# 输出结果为:
# A B
# x 1 4
# y 2 5
# z 3 6
# # 更改DataFrame的索引名称
df.rename(index={'x':'one'},inplace=True)
print(df)
# 输出结果为:
# A B
# one 1 4
# y 2 5
# z 3 6
df.rename(columns={'A':'one'},inplace=True)
print(df)
# 输出结果为:
# one B
# one 1 4
# y 2 5
# z 3 6
df\['列'\].replace(原数据,现数据,inplace=False)
import pandas as pd
# 创建一个简单的DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
}, index=['x', 'y', 'z'])
print(df)
# 输出结果为:
# A B
# x 1 4
# y 2 5
# z 3 6
# # 更改DataFrame的索引名称
df['A'].replace(1,'replace',inplace=True)
print(df)
# 输出结果为:
# A B
# x replace 4
# y 2 5
# z 3 6
df\[列\].drop\_duplicate(keep) 用于去除重复的值,会返回一个新的series对象,只包含原始series中的唯一值
keep =‘first’用于保留第一个出现的重复值
keep=‘last’用于保留最后一个出现的重复值
可以用reset\_index重置索引值
import pandas as pd
# 创建一个包含重复城市名称的DataFrame
data = {
'city': ['Shanghai', 'Beijing', 'Shanghai', 'Hangzhou', 'Shenzhen', 'Beijing', 'Guangzhou']
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 原始DataFrame:
# city
# 0 Shanghai
# 1 Beijing
# 2 Shanghai
# 3 Hangzhou
# 4 Shenzhen
# 5 Beijing
# 6 Guangzhou
# 获取不重复的城市名称
unique_cities = df['city'].drop_duplicates(keep='last')
print("不重复的城市名称:")
print(unique_cities)
# 不重复的城市名称:
# 2 Shanghai
# 3 Hangzhou
# 4 Shenzhen
# 5 Beijing
# 6 Guangzhou
# Name: city, dtype: object
# 重置索引
unique_cities_reset = unique_cities.reset_index(drop=True)
print("不重复的城市名称(重置索引后):")
print(unique_cities_reset)
# 不重复的城市名称(重置索引后):
# 0 Shanghai
# 1 Hangzhou
# 2 Shenzhen
# 3 Beijing
# 4 Guangzhou
# Name: city, dtype: object