用PHP或Python从FTP服务器读取或下载5kb的文件,而不是下载或读取整个文件

用PHP或Python从FTP服务器读取或下载5kb的文件,而不是下载或读取整个文件,php,python,ftp,Php,Python,Ftp,我想从FTP服务器下载或读取文件的一部分,而不是下载整个文件,这只是为了查看FTP服务器中存在的数据是否正确 我们有这么多的客户端,FTP服务器中的每个文件都可能是任意大小的,所以我不想下载或阅读完整的文件,我只想下载或读取文件的一部分,比如说,我只需要5kb的文件,或者从一个文件中删除100行 我有一个PHP函数,如下所示,它完成了一半的工作,但对于较大的文件,它失败了 function readByBytes($path) { try { $handle =

我想从FTP服务器下载或读取文件的一部分,而不是下载整个文件,这只是为了查看FTP服务器中存在的数据是否正确

我们有这么多的客户端,FTP服务器中的每个文件都可能是任意大小的,所以我不想下载或阅读完整的文件,我只想下载或读取文件的一部分,比如说,我只需要5kb的文件,或者从一个文件中删除100行

我有一个PHP函数,如下所示,它完成了一半的工作,但对于较大的文件,它失败了

function readByBytes($path)
{
    try
    {
        $handle = fopen($path, "rb");
        if ($handle) 
        {
            while (($buffer = fgets($handle, 4096)) !== false)
            {

            }
            if (!feof($handle))
            {
                echo "Error: unexpected fgets() fail\n";
            }
            fclose($handle);
        }
    }
    catch (Exception $e)
    {
        echo $e;
    }
}


$filename = "ftp://username:password@127.0.0.1/prod/clientfeed.csv";

$iterator = readByBytes($filename);

foreach ($iterator as $key => $iteration)
{
    /// if file read is 5kb or some 100 lines
    break;
}
有人能在PHP或Python中帮助我或指导我吗

以下警告错误获取

PHP警告:fopen(ftp://...@127.0.0.1/prod/clientfeed.csv):失败
打开流:FTP服务器无法获取文件大小。
在第80行的/var/www/html/newLpplugins/ftp\u read\u line\u line.php中
PHP警告:filesize():的stat失败
ftp://...@127.0.0.1/prod/clientfeed.csv输入
/var/www/html/newLpplugins/ftp\u read\u line\u line.php,第81行
PHP警告:fread()期望参数1是资源,bool给定
在第81行的/var/www/html/newLpplugins/ftp\u read\u line\u line.php中
PHP警告:fclose()期望参数1是资源,bool给定
在第82行的/var/www/html/newLpplugins/ftp\u read\u line\u line.php中
PHP警告:
文件\u获取\u内容(ftp://...@127.0.0.1/prod/clientfeed.csv):未能
打开流:FTP服务器无法获取文件大小。
在第84行的/var/www/html/newLpplugins/ftp\u read\u line\u line.php中

提前感谢。

如果您只想读取文件的一部分,那么只需在执行
循环时删除
,并只调用
fgets
一次即可

$buffer = fgets($handle, 4096);

不过,如果文件是二进制文件,或者如果要读取固定数量的字节,则最好使用


尽管您的服务器与PHP URL包装不兼容,请参阅:

PHP并没有为您的需求提供任何其他健壮的替代方案


尽管在Python中使用ftplib是可行的:

ftp = FTP()
ftp.connect(host, user, passwd)

size = 4096

cmd = "RETR {}".format(filename)
f = BytesIO()
aborted = False

def gotdata(data):
    f.write(data)
    while (not aborted) and (f.tell() >= size):
        ftp.abort()
        aborted = True

try:
    ftp.retrbinary(cmd, gotdata)
except:
    # An exception when transfer is aborted is expected
    if not aborted:
        raise

f.seek(0)
代码基于我对的回答:

在python中有很多方法可以实现这一点

解决方案1:

Paramkio—用python实现的SSH V2库 Paramiko可以选择从远程位置的文件中读取N个字节

sClient = ssh_client.open_sftp()
remoteFileLocation = sftp_client.open('<filepath>')
for line in remote_file:
    #dosomethinghere

问题是关于FTP,而不是SFTP。
sClient = ssh_client.open_sftp()
remoteFileLocation = sftp_client.open('<filepath>')
for line in remote_file:
    #dosomethinghere
        from subprocess import Popen, PIPE
        p = Popen(["du", "-sh", "filepath"], stdin=PIPE)
        output = p.communicate(msg.as_string())