python读取ftp记录并入数据库

记录python读取ftp记录并入数据库。保存一些常用方法,分享给大家。

1、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

2、pandas操作excel

import pandas as pd

#读取excel

df = pd.read_csv(path + file

   ,sep=',' #指定逗号为分隔符

   ,header=0   #指定第一行为表头

   ,usecols=["lsh"] #指定列

   ,engine='python'

   ,encoding = 'gb18030' #指定编码 utf-8

)

#写入excel

pd.DataFrame(data)

    .to_excel(path, sheet_name=sheetname, index=False)

3、pandas操作数据库

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 #整数,一次写入数据时的数据行数量
)

4、用pymysql操作数据库

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

 

5、dataframe的用法总结

## 1.df.fillna(value=0)填充

用于填充数据表中元素为空的部分,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

### df\[列\].fillna(value=0)

对单列进行填充,也是value缺省时默认为0 

dk=df\['two'\].fillna(value=1)#将1填充后的数据表

print(dk)

# 输出:只输出一列

# 0    a

# 1    b

# 2    1

# 3    d

# 4    e

一般处理缺失值的时候可以把平均值填充进去

下面是数据表某一列的平均值

### df\[列\].means()计算平均值

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

## 2.df.\[列\].map(str.strip)清除字符空格

### 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

## 3.df.astype(类型)

将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

##  4.改变index和columns的值

### 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

## 5.数据替换

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

## 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

你可能感兴趣的:(python,python,数据库,开发语言)