2013-07-03 210 views
12

我試圖從windows服務器上傳文件到unix服務器(基本上試圖做FTP)。我用下面FTP上傳文件Python

#!/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上傳文件。

回答

12

如果您試圖存儲非二進制文件(如文本文件),請嘗試將其設置爲讀取模式而不是寫入模式。

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

二進制文件(任何不能在一個文本編輯器打開)打開你在讀二進制模式

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

另外,如果你打算使用FTP lib中你也許應該通過一個教程,我建議從effbot這article

+0

MyFile.py的內容不會被刪除。但我仍然在等錯誤。 – misguided

+2

使用storlines假定myfile是一個文本文件。對於其他文件(圖像,電影,檔案,基本上任何你無法在文本編輯器中打開並閱讀的內容),你應該使用storbinary並用'rb'打開文件,而不是'r –

+0

根據http://bugs.python .org/issue6822非二進制文件也應該用'rb'標誌打開,但之後仍然用'storlines()'上傳。只是遇到了'r'和'Type str不支持緩衝區AP'的問題,並且提供了鏈接。 –

3

嘗試將該文件作爲對象,以便您可以在操作結束時關閉它。

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

,並在傳輸

myfile.close() 

本月底可能不會解決問題,但它可能會有所幫助。

+0

還是一樣的錯誤。 – misguided

+0

啊,很高興聽到你終於想通了! – mbdavis

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() 
+3

使用storlines假定myfile是一個文本文件。對於其他文件(圖像,電影,檔案,基本上無法在文本編輯器中打開並閱讀的任何內容),您應該使用storbinary並使用'rb'而不是'r'打開文件。 –

+0

至少在當前版本中,您需要以二進制模式('rb')打開文件才能發送,否則會出錯。編輯:沒有意識到有人已經說過這個^ –