Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从SFTP服务器解析CSV太慢,如何提高效率?_Python_Csv_Web_Sftp - Fatal编程技术网

Python 从SFTP服务器解析CSV太慢,如何提高效率?

Python 从SFTP服务器解析CSV太慢,如何提高效率?,python,csv,web,sftp,Python,Csv,Web,Sftp,所以我有一个SFTP服务器,它承载一个CSV文件,其中包含关于多个课程的数据。数据采用以下格式4列: 活动名称、活动代码、完成状态、全名 激光安全,3XX1,2010年7月10日,人员,姓名 激光安全,3XX1,NaN,OtherP,OtherName 如何使用扳手,7NPA,19年8月10日,其他姓名,个人 等 我正在使用Paramiko通过以下代码访问该文件: file = sftp.open('Data.csv') 但我遇到的问题是,它是一种SFTPFile类型。我如何从中解析数据?我需

所以我有一个SFTP服务器,它承载一个CSV文件,其中包含关于多个课程的数据。数据采用以下格式4列:

活动名称、活动代码、完成状态、全名 激光安全,3XX1,2010年7月10日,人员,姓名 激光安全,3XX1,NaN,OtherP,OtherName 如何使用扳手,7NPA,19年8月10日,其他姓名,个人 等 我正在使用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

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

如果没有安装c编译器,则需要一个编译器来完成此操作。 尝试使用Cython使事情变得更快:

import pandas as pd
import time

start_time = time.time()

csvreal = pd.read_csv("Data.csv")
Courses = ['']
cdef int Total[0]
cdef int Compl[0]

cdef int i = 0
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

print("--- %s seconds ---" % (time.time() - start_time))
您需要使用pip install Python安装Cython,并使用同一目录中的setup.py文件编译新文件。完成所有这些操作的教程链接如下:


希望这有帮助

如果没有安装c编译器,则需要一个编译器来完成此操作。 尝试使用Cython使事情变得更快:

import pandas as pd
import time

start_time = time.time()

csvreal = pd.read_csv("Data.csv")
Courses = ['']
cdef int Total[0]
cdef int Compl[0]

cdef int i = 0
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

print("--- %s seconds ---" % (time.time() - start_time))
您需要使用pip install Python安装Cython,并使用同一目录中的setup.py文件编译新文件。完成所有这些操作的教程链接如下:

希望这有帮助

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

由于我手头没有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')
在远程服务器上打开文件,因此每次读取都将通过网络进行。与从本地磁盘读取相比,这种网络遍历非常慢。使用将文件复制到本地计算机会更有效,这样就可以读取文件,而不会产生穿越网络的开销。如果需要更新文件,可以更新本地副本,然后使用将其复制回服务器

由于我手头没有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')

这是如何使它更快的呢?Python是一种动态语言。每次调用变量时,它必须检查每个变量集的类型。在这种情况下,每次在for循环中调用变量i、Total和Compl时都会对它们进行检查。Cython允许使用C语言编写python代码。这允许对变量进行类型设置转换。然后,Python在运行for循环时不必检查所有变量的类型。我是个新手,速度只有0.004秒。如果你更多地运行循环,这会增加速度。这会使它更快吗?Python是一种动态语言。每次调用变量时,它必须检查每个变量集的类型。在这种情况下,每次在for循环中调用变量i、Total和Compl时都会对它们进行检查。Cython允许使用C语言编写python代码。这允许对变量进行类型设置转换。然后,Python在运行for循环时不必检查所有变量的类型。我是个新手,速度只有0.004秒。如果你更多地运行循环,这将增加。虽然通常是真的,但Paramiko可以缓冲读取。看到了吗?谢谢,我不知道。如果提问者同意你的答案解决了他们的问题,我很乐意将此标记为你答案的副本。虽然一般来说是正确的,但Paramiko可以缓冲阅读。看到了吗?谢谢,我不知道。如果提问者同意你的答案解决了他们的问题,我很乐意将此标记为你答案的副本。