我正在尝试使用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()
答案 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()