【发布时间】:2014-10-28 23:35:53
【问题描述】:
我试图了解 python 如何将数据从 FTP 服务器提取到 pandas 中,然后将其移动到 SQL 服务器中。我的代码至少可以说是非常简陋的,我正在寻找任何建议或帮助。我曾尝试先从 FTP 服务器加载数据,但效果很好。...服务器似乎引起了问题。
import pyodbc
import pandas
from ftplib import FTP
from StringIO import StringIO
import csv
ftp = FTP ('ftp.xyz.com','user','pass' )
ftp.set_pasv(True)
r = StringIO()
ftp.retrbinary('filname.csv', r.write)
pandas.read_table (r.getvalue(), delimiter=',')
connStr = ('DRIVER={SQL Server Native Client 10.0};SERVER=localhost;DATABASE=TESTFEED;UID=sa;PWD=pass')
conn = pyodbc.connect(connStr)
cursor = conn.cursor()
cursor.execute("INSERT INTO dbo.tblImport(Startdt, Enddt, x,y,z,)" "VALUES (x,x,x,x,x,x,x,x,x,x.x,x)")
cursor.close()
conn.commit()
conn.close()
print"Script has successfully run!"
当我删除 ftp 代码时,它可以完美运行,但我不明白如何进行下一次跳转以将其导入 Microsoft SQL 服务器,或者即使可以不先保存到文件中。
【问题讨论】:
-
你知道如何将参数传递给
execute函数吗?如果是这样,您需要做的就是遍历DataFrame的行,并为每一行调用execute并将该行作为SQL 参数的值传递。或者,如果 PyODBC 支持executemany,那就更简单了——只需传递您已经拥有的任何可迭代的行。 -
话虽如此,您在这里使用 Pandas 而不是
csv有什么原因吗?您实际上并没有对数据做任何 Pandas-y 操作,只是对其进行迭代。在这种情况下,csv要简单得多,并且不需要一次将整个内容全部读入内存。 -
感谢您的回复,除了我读到它之外,我没有真正使用熊猫,而且转储到数据框似乎是合乎逻辑的。我的基本目标是使用 CSV 将 FTP 数据导入 SQL,这是否只能在事件发生后通过 CVS 文件实现?理想情况下,我想一口气拉入 SQL。
-
就数据而言,文件非常小(大约 10Kb),因此读入内存不是问题
-
您不需要创建实际的 CSV 文件;
csv模块与StringIO一起工作得很好,就像你已经在做的那样,我很确定 Pandas 也可以。无论哪种方式,目标只是获得一些可迭代的行并通过循环遍历行并调用execute来插入每一行。