C'è un modo per scrivere una stringa direttamente su un file? Da http://docs.python.org/library/tarfile.html sembra che solo i file già scritti nel file system possano essere aggiunti.stringa di scrittura Python direttamente su tarfile
risposta
Direi che è possibile, giocando con TarInfo e TarFile.addfile passando un StringIO come un oggetto file.
Molto grezzo, ma funziona
import tarfile
import StringIO
tar = tarfile.TarFile("test.tar","w")
string = StringIO.StringIO()
string.write("hello")
string.seek(0)
info = tarfile.TarInfo(name="foo")
info.size=len(string.buf)
tar.addfile(tarinfo=info, fileobj=string)
tar.close()
Come Stefano ha sottolineato, è possibile utilizzare TarFile.addfile
e StringIO
.
import tarfile, StringIO
data = 'hello, world!'
tarinfo = tarfile.TarInfo('test.txt')
tarinfo.size = len(data)
tar = tarfile.open('test.tar', 'a')
tar.addfile(tarinfo, StringIO.StringIO(data))
tar.close()
probabilmente si vorrà per riempire altri campi di tarinfo
(ad esempio mtime
, uname
ecc) così.
è il "Come Stefano ha sottolineato" una modifica? Altrimenti, non vedo cosa stai facendo in modo diverso. Grazie per la risposta lo stesso. – gatoatigrado
Penso che Stefano non abbia pubblicato alcun codice nel momento in cui ho scritto la mia risposta, ha solo notato che TarFile.addfile e StringIO possono essere usati. La mia memoria è poco sfocata, però. – avakar
FWIW, sì, le informazioni dettagliate di @ Stefano sono state aggiunte in [un edit] (http://stackoverflow.com/posts/740839/revisions) dopo averlo scritto. Anche l'altra risposta che diceva la stessa cosa avveniva quasi simultaneamente. – mattdm
è necessario utilizzare gli oggetti TarInfo e il metodo addfile invece del solito metodo Add:
from StringIO import StringIO
from tarfile import open, TarInfo
s = "Hello World!"
ti = TarInfo("test.txt")
ti.size = len(s)
tf = open("testtar.tar", "w")
tf.addfile(ti, StringIO(s))
Nel mio caso ho voluto leggere da un file tar esistente, aggiungere alcuni dati ai contenuti, e scrivere in un nuovo file. Qualcosa di simile:
for ti in tar_in:
buf_in = tar.extractfile(ti)
buf_out = io.BytesIO()
size = buf_out.write(buf_in.read())
size += buf_out.write(other data)
buf_out.seek(0)
ti.size = size
tar_out.addfile(ti, fileobj=buf_out)
Codice aggiuntivo è necessario per la gestione di directory e collegamenti.
Solo per la cronologia:
Gli oggetti StringIO hanno una proprietà .len.
Non c'è bisogno di cercare (0) e fare len (foo.buf)
Non c'è bisogno di tenere l'intera stringa in giro per fare len(), o Dio non voglia, fare la contabilità da soli.
(Forse non ha al momento il PO è stato scritto.)
ho trovato questo guardando come servire in Django un appena creato in memoria .tgz archivio, può essere qualcun altro troverà il mio codice utile:
import tarfile
from io import BytesIO
def serve_file(request):
out = BytesIO()
tar = tarfile.open(mode = "w:gz", fileobj = out)
data = 'lala'.encode('utf-8')
file = BytesIO(data)
info = tarfile.TarInfo(name="1.txt")
info.size = len(data)
tar.addfile(tarinfo=info, fileobj=file)
tar.close()
response = HttpResponse(out.getvalue(), content_type='application/tgz')
response['Content-Disposition'] = 'attachment; filename=myfile.tgz'
return response
- 1. Output di avanzamento tarfile Python?
- 2. aggiungi directory vuota a tarfile
- 3. scrivere direttamente su std :: buffer interni stringa
- 4. Scrittura di codice Python su Android
- 5. Hadoop - Scrittura in HBase direttamente dal Mapper
- 6. Scrittura di una stringa (con nuove righe) in Python
- 7. Scrittura di una stringa ASCII come binario in python
- 8. python configparser scrittura su default sezione
- 9. Scrittura su file UTF-8 in Python
- 10. File di Python Lettura + Scrittura
- 11. Scrittura di una stringa IO su stdout in Haskell
- 12. Scrittura di elenchi Python su colonne in csv
- 13. Scrittura dati in Python
- 14. Scrittura della stringa sul flusso di output
- 15. Scrittura schermo con Python
- 16. Salva Dataframe in csv direttamente su s3 Python
- 17. Scrittura di un QNetworkReply su un file
- 18. Come costruire un oggetto TarFile in memoria dal buffer di byte in Python 3?
- 19. Ambito di scrittura ({) nella stringa nell'app console
- 20. Impostazione dei permessi sui file sul contenuto del tarfile
- 21. come scrivere stringstream direttamente su cout
- 22. Scrittura dei dati su LMDB con Python molto lento
- 23. Scrittura blob da SQLite su file utilizzando Python
- 24. Come posso elaborare un tarfile con un pool di multiprocessing Python?
- 25. Scrittura XML su Android
- 26. Scrittura di video con OpenCV + Python + Mac
- 27. Scrittura su file (Prolog)
- 28. StreamWriter scrittura su MemoryStream
- 29. caricare immagine direttamente su Twitter
- 30. Scrittura di un file su sdcard
Si può semplicemente pronunciare StringIO.StringIO ("ciao") per sostituire la scrittura e la ricerca. – misha
è la procedura simile agli oggetti python3 e bytesIO? – proteneer
@proteneer: Credo in python 3 il metodo seek fornisce una lunghezza binaria, mentre internamente usa la funzione '' 'len()' '', in modo che la funzione '' 'tarfile.copyfileobj''' fallisca con '' 'solleva OSError (" fine del file raggiunto ")' '' – luckydonald