代码之家  ›  专栏  ›  技术社区  ›  gatoatigrado

python将字符串直接写入文件

  •  30
  • gatoatigrado  · 技术社区  · 15 年前

    有没有办法将字符串直接写入文件?从…起 http://docs.python.org/library/tarfile.html 看起来只能添加已写入文件系统的文件。

    7 回复  |  直到 15 年前
        1
  •  37
  •   Stefano Borini    15 年前

    我想说,通过使用TarInfo e TarFile.addfile将StringIO作为文件对象传递,这是可能的。

    很粗糙,但很有效

    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()
    
        2
  •  16
  •   avakar    15 年前

    正如Stefano指出的,您可以使用 TarFile.addfile 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()
    

    tarinfo (例如。 mtime uname 等等)以及。

        3
  •  10
  •   scythargon    8 年前

    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
    
        4
  •  4
  •   Alias_Knagg    10 年前



    无需搜索(0)和执行len(foo.buf)
    不需要保留整个字符串来进行len()操作,或者上帝禁止,您自己进行会计处理。

        5
  •  4
  •   Todd Owen    6 年前

    Python3中的解决方案使用 io.BytesIO . 一定要做好准备 TarInfo.size 设置为字节的长度,而不是字符串的长度。

    给定单个字符串,最简单的解决方案是调用 .encode()

    import io
    import tarfile
    
    data = 'hello\n'.encode('utf8')
    info = tarfile.TarInfo(name='foo.txt')
    info.size = len(data)
    
    with tarfile.TarFile('test.tar', 'w') as tar:
        tar.addfile(info, io.BytesIO(data))
    

    如果你真的需要一个可写的 一串 io.TextIOWrapper 在潜在的 缓冲器

    import io
    import tarfile
    
    textIO = io.TextIOWrapper(io.BytesIO(), encoding='utf8')
    textIO.write('hello\n')
    bytesIO = textIO.detach()
    info = tarfile.TarInfo(name='foo.txt')
    info.size = bytesIO.tell()
    
    with tarfile.TarFile('test.tar', 'w') as tar:
        bytesIO.seek(0)
        tar.addfile(info, bytesIO)
    
        6
  •  3
  •   z0r    11 年前

    在我的例子中,我想从现有的tar文件中读取数据,将一些数据附加到内容中,然后将其写入一个新文件。比如:

    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)
    

    处理目录和链接需要额外的代码。

        7
  •  2
  •   Eli Courtwright    15 年前

    您必须使用TarInfo对象和addfile方法,而不是通常的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))