2014-09-09 11 views
6

Sto cercando di scrivere un testo direttamente al mio sito FTP in pitone senza memorizzare un file temporaneo su disco, qualcosa come:Python scrivere creare il file direttamente in FTP

ftp = FTP('ftp.mysite.com') 
ftp.login('un','pw') 
ftp.cwd('/') 
ftp.storbinary('STOR myfile.html', 'text to store', 'rb') 

è anche possibile? Grazie mille.

risposta

8

Come the docs dicono:

Conservare un file nella modalità di trasferimento binario. cmd dovrebbe essere un comando appropriato STOR: "STOR filename". file di è un oggetto file (aperto in modalità binaria) che viene letto fino EOF usando il proprio metodo read() in blocchi di dimensioni blocksize di fornire i dati da memorizzare ...

Quindi, è necessario dare un oggetto simile a un file con un metodo appropriato read.

Una stringa non è un oggetto simile a un file, ma uno è io.BytesIO. Quindi:

import io 
bio = io.BytesIO(b'text to store') 
ftp.storbinary('STOR myfile.html', bio) 

Inoltre, si noti che non ho passare che 'rb' argomento. Il terzo parametro a storbinary è blocksize e 'rb' non è ovviamente una dimensione di blocco valida.


Se è necessario lavorare con Python 2.5 o versioni precedenti, vedere la risposta di Dan Lenski.

E se avete bisogno di lavorare con Python 2.6-2.7, e le prestazioni dell'oggetto simile a file è importante (non è qui, ma ci sono alcuni casi in cui potrebbe essere), e vi interessa solo CPython , usa la sua risposta ma con cStringIO al posto di StringIO. (Semplice StringIO è lento in 2.x, e io.BytesIO è ancora più lento prima di circa 3.3.)

+0

Ha funzionato per me ma ho dovuto codificare la stringa come BytesIO requiresa oggetto simile a un byte. Quindi: 'bio = io.BytesIO ('text to store'.encode (' utf-8 '))' – iomihai

+1

@iomihai Bene, in questo caso, potresti semplicemente usare un byte letterale, invece di usare str letteral e encoding esso. Ma sì, modificherò la risposta. – abarnert

5

Hai provato a utilizzare un StringIO object, che cova come un file ma è solo una stringa?

from ftplib import * 
import StringIO 

ftp = FTP('ftp.mysite.com') 
ftp.login('un','pw') 
ftp.cwd('/') 
ftp.storbinary('STOR myfile.html', StringIO.StringIO('text to store')) 

EDIT: @abarnert's answer è l'equivalente python3. Il mio è la versione di Python2.

+1

'io' funziona altrettanto bene in 2.6 e 2.7 come fa in 3.x. Quindi non c'è motivo di usare la vecchia versione a meno che non sia necessaria la compatibilità 2.5. – abarnert

+0

Buon punto! ('# its_still_2007_where_I_am') –

+0

Beh, ho mantenuto la compatibilità 1.5 fino al 2.4 aggiungendo alcune funzionalità di cui non potrei vivere senza, quindi posso capire che ... – abarnert