首页 > 解决方案 > 从 SFTP 服务器解析 CSV 太慢,如何提高效率?

问题描述

所以我有一个 SFTP 服务器,它托管一个包含多个课程数据的 CSV 文件。数据采用以下格式(4 列):

Activity Name,Activity Code,Completion Status,Full Name
Safety with Lasers, 3XX1, 10-Jul-20, "Person, Name"
Safety with Lasers, 3XX1, NaN, "OtherP, OtherName"
How to use wrench, 7NPA, 10-Aug-19, "OtherName, Person"
etc...

我正在使用 Paramiko 使用以下代码访问文件:

file = sftp.open('Data.csv')

但我遇到的问题是它是 SFTPFile 类型。我该如何解析其中的数据?我需要提取课程的名称,并跟踪有多少人完成了它和没有完成它。我目前正在使用以下代码,但速度非常慢。任何建议,将不胜感激:

Courses = ['']
Total =[0]
Compl =[0]
csvreal = pandas.read_csv(file)
for index, row in csvreal.iterrows():
    string =(csvreal.loc[[index]].to_string(index=False, header=False))
    if(Courses[i] !=string.split('  ')[0]):
        i+=1
        Courses.append(string.split('  ')[0])
        Total.append(0)
        Compl.append(0)
    if(len(string.split('  ')[2])>3):  #Note that incomplete courses do not have completion date, so it is NaN
        Compl[i]+=1
    Total[i]+=1

我知道这很糟糕,我是新手,不知道自己在做什么。任何有关在何处阅读相关文档或教程的建议将不胜感激。谢谢!

标签: pythoncsvwebsftp

解决方案


sftp.open在远程服务器上打开文件,因此每次读取都将通过网络进行。与从本地磁盘读取相比,这种网络遍历非常慢。使用sftp.get将文件复制到本地机器会更有效,然后可以读取它而不会产生遍历网络的开销。如果您需要更新文件,您可以更新本地副本,然后使用sftp.put复制回服务器。

代码将是这样的(未经测试,因为我手头没有 ftp 服务器):

# Retrieve a copy and open
myfile = sftp.get('Data.csv', 'local-copy-Data.csv')
csvreal = pandas.read_csv(myfile)

# Update remote
sftp.put('local-copy-Data.csv', 'Data.csv')

推荐阅读