如何在python中将rackspace cloudfile读入字符串?

时间:2012-11-30 12:38:14

标签: python gzip rackspace

我想从rackspace解析日志文件。我正在使用official python sdk。 我之前已将文件保存到磁盘,然后使用gzip.open从那里读取。

现在我在heroku上,不能/不想将文件保存到磁盘,但是在内存中解压缩。

但是,我无法将对象下载为字符串或伪文件对象来处理它。

有人有想法吗?

logString = ''
buffer = logfile.stream()

while True:
    try:
        logString += buffer.next()
    except StopIteration:
        break

# logString is always empty here

# I'd like to have something that enables me to do this:
for line in zlib.decompress(logString):
    # having each line of the log here

更新

我注意到,空字符串并不完全正确。这是循环,只是第一次出现是空的。下一次出现我确实有数据(看起来像是gzip),但我得到这个zlib错误:

zlib.error: Error -3 while decompressing data: incorrect header check

更新II

根据建议,我实现了cStringIO,结果相同:

 buffer = logfile.stream()
     output = cStringIO.StringIO()

         while True:
             try:
                  output.write(buffer.next())
             except StopIteration:
             break

         print(output.getvalue())

更新III 这确实有效:

output = cStringIO.StringIO()

try:
    for buffer in logfile.stream():
        output.write(buffer)
except StopIteration:
    break

至少在这里没有崩溃,但似乎没有获得实际的线路:

for line in gzip.GzipFile(fileobj=output).readlines():
    # this is never reached

如何前往这里?是否有一些简单的方法可以将传入的数据视为普通字符串,以了解我是否正确的方式?

1 个答案:

答案 0 :(得分:0)

我发现read()也是一个选项,这导致了这样一个简单的解决方案:

 io = cStringIO.StringIO(logfile.read())
     for line in GzipFile(fileobj=io).readlines():
         impression = LogParser._parseLine(line)
         if impression is not None:
             impressions.append(impression)