FTP上传文件Python

时间:2013-07-03 00:54:22

标签: python ftp

我正在尝试将文件从Windows服务器上传到unix服务器(基本上尝试做FTP)。我使用了以下代码

#!/usr/bin/python
import ftplib
import os
filename = "MyFile.py"
ftp = ftplib.FTP("xx.xx.xx.xx")
ftp.login("UID", "PSW")
ftp.cwd("/Unix/Folder/where/I/want/to/put/file")
os.chdir(r"\\windows\folder\which\has\file")
ftp.storbinary('RETR %s' % filename, open(filename, 'w').write)

我收到以下错误:

Traceback (most recent call last):
  File "Windows\folder\which\has\file\MyFile.py", line 11, in <module>
    ftp.storbinary('RETR %s' % filename, open(filename, 'w').write)
  File "windows\folder\Python\lib\ftplib.py", line 466, in storbinary
    buf = fp.read(blocksize)
AttributeError: 'builtin_function_or_method' object has no attribute 'read'

此外,MyFile.py的所有内容都已删除。

任何人都可以告知出了什么问题。我读过ftp.storbinary用于使用FTP上传文件。

4 个答案:

答案 0 :(得分:16)

如果您尝试存储非二进制文件(如文本文件),请尝试将其设置为读取模式而不是写入模式。

ftp.storlines("STOR " + filename, open(filename, 'r'))

二进制文件(任何无法在文本编辑器中打开的文件)以读二进制模式打开文件

ftp.storbinary("STOR " + filename, open(filename, 'rb'))

如果你计划使用ftp lib,你可能应该通过一个教程,我推荐来自effbot的article

答案 1 :(得分:8)

结合两项建议。最终答案是

#!/usr/bin/python
import ftplib
import os
filename = "MyFile.py"
ftp = ftplib.FTP("xx.xx.xx.xx")
ftp.login("UID", "PSW")
ftp.cwd("/Unix/Folder/where/I/want/to/put/file")
os.chdir(r"\\windows\folder\which\has\file")
myfile = open(filename, 'r')
ftp.storlines('STOR ' + filename, myfile)
myfile.close()

答案 2 :(得分:3)

尝试将文件设为对象,以便在操作结束时关闭它。

myfile = open(filename, 'w')
ftp.storbinary('RETR %s' % filename, myfile.write)

并在转移结束时

 myfile.close()

这可能无法解决问题,但可能有所帮助。

答案 3 :(得分:0)

ftplib supports the use of context managers,因此您可以使其更加简单

public class LineNumberedEditText extends EditText
{
    private final Context context;
    private Rect rect;
    private Paint paint;

    public LineNumberedEditText(Context context)
    {
        super(context);
        this.context = context;
        init();
    }

    public LineNumberedEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.context = context;
        init();
    }

    public LineNumberedEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        this.context=context;
        init();
    }

    private void init()
    {
        rect = new Rect();
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.GRAY);
        paint.setTextSize(20);
        paint.setTypeface(Typeface.MONOSPACE);
    }


    @Override
    protected void onDraw(Canvas canvas) {

        int baseline;
        int lineCount = getLineCount();
        int lineNumber = 1;

        for (int i = 0; i < lineCount; ++i) 
        {
            baseline=getLineBounds(i, null);
            if (i == 0) 
            {
                canvas.drawText(""+lineNumber, rect.left, baseline, paint);
                ++lineNumber;
            } 
            else if (getText().charAt(getLayout().getLineStart(i) - 1) == '\n') 
            {
                canvas.drawText(""+lineNumber, rect.left, baseline, paint);
                ++lineNumber;
            }
        }   


// for setting edittext start padding
        if(lineCount<100)
        {
            setPadding(40,getPaddingTop(),getPaddingRight(),getPaddingBottom());
        }
        else if(lineCount>99 && lineCount<1000)
        {
            setPadding(50,getPaddingTop(),getPaddingRight(),getPaddingBottom());
        }
        else if(lineCount>999 && lineCount<10000)
        {
            setPadding(60,getPaddingTop(),getPaddingRight(),getPaddingBottom());
        }
        else if(lineCount>9999 && lineCount<100000)
        {
            setPadding(70,getPaddingTop(),getPaddingRight(),getPaddingBottom());
        }

        super.onDraw(canvas);
    }
}

通过这种方式,您无需插入try / except / finally块,即可对文件和ftp问题都保持稳定。好吧,这是pythonic。

PS:由于它使用f字符串,因此仅是python> = 3.6,但可以轻松修改以使用旧的.format()语法