gzip将新行写入文件python

时间:2014-09-16 23:06:25

标签: python

我正在尝试使用python中的gzip将一个可迭代的元组写入文件。但是当我写新行字符(\ n)

For example:
   if the iterable of tuples is like this: [(1,2,3) , (4,5)]
   the output file should be : 1,2,3
                               4,5

   but I got: 1,2,34,5



   I dont know where is my newline character gone!!!

   Here is my code: 
      fi = gzip.open(filename, "wb")
      for tup in data:
        fi.write(','.join(str(x) for x in tup).encode("utf-8"))
        fi.write("\n".encode("utf-8"))
      fi.close()

1 个答案:

答案 0 :(得分:3)

我只能假设您正在阅读或显示未压缩数据的方式存在问题?我在Windows和Linux(Python 2.7)上尝试了以下代码,它确实有效:

import gzip

filename = 'gzipout.gz'
data =  [(1,2,3) , (4,5)]
fi = gzip.open(filename, 'wb')
for tup in data:
    fi.write(','.join(str(x) for x in tup).encode("utf-8"))
    fi.write('\n'.encode("utf-8"))
fi.close()

fi = gzip.open(filename, 'rb')
unzipdata = fi.read()
print unzipdata
fi.close()

输出结果为:

1,2,3
4,5

此代码只是将内容gzip到文件,然后读回压缩数据并将其转储到控制台。换行符存在。

如果我使用gunzip gzipout.gz它将提取到gzipout,如果我显示内容,则还会出现换行符。

您的行为并不罕见,特别是如果您使用旧的脑死程序打开未压缩的文本文件。在* nix世界中,行尾(EOL)通常由\n表示。在Windows中,EOL由两个字符\r\n表示。 Python有一个用于编写文本的通用模式,以便它自动将\n转换为平台上的任何EOL。不幸的是,GZIP似乎仍然没有用Python 2.7来纪念那面旗帜。这意味着即使您打开GZIP文件以使用模式“U”(文本模式+通用)进行写入,也不会在每次写入时进行翻译。

如果您使用的是Windows平台并针对Windows用户,那么您可能会考虑明确编写'\ r \ n'的非便携式解决方案,以便像记事本这样的脑死亡编辑器能够正确呈现。我猜这样的事情会产生你想要的结果:

for tup in data:
    fi.write(','.join(str(x) for x in tup).encode("utf-8"))
    fi.write('\r\n'.encode("utf-8")) # notice I use \r\n instead of \n
fi.close()