在python中将字符串保存到二进制文件

Posted

技术标签:

【中文标题】在python中将字符串保存到二进制文件【英文标题】:save string to a binary file in python 【发布时间】:2013-03-04 15:36:03 【问题描述】:

我想知道 Python 编程的一个非常基本的事情,因为我现在是一个非常基本的程序员):如何将结果(列表、字符串或其他)保存到 Python 中的文件中? 我一直在寻找很多,但我找不到任何好的答案。 我在考虑“.write ()”方法,但是(例如)它似乎不适用于字符串,但我也不知道它应该做什么。 所以,我的情况是我有二进制文件,我想编辑它,因此我发现很容易将它们转换为字符串,修改它们,现在我想将它们保存 i)回二进制文件(jpegs 图像) ii) 在我想要的文件夹中。 我该怎么做?我需要一些帮助。

更新

这是我要运行的脚本:

import os, sys

newpath= r'C:/Users/Umberto/Desktop/temporary'
if not os.path.exists (newpath):
    os.makedirs (newpath)

data= open ('C:/Users/Umberto/Desktop/Prove_Script/Varie/_BR_Browse.001_2065642654_1.BINARY', 'rb+')
edit_data= str (data.read () )
out_dir= os.path.join (newpath, 'feed', 'address')

data.close ()


# do my edits in a secon time...

edit_data.write (newpath)

edit_data.close ()

我得到的错误是:

AttributeError: 'str' object has no attribute 'write'

UPDATE_2

我尝试使用pickle模块来序列化我的二进制文件,修改它并在最后保存它,但仍然没有让它工作......这是我迄今为止一直在尝试的:

import cPickle as pickle
binary= open ('C:\Users\Umberto\Desktop\Prove_Script\Varie\_BR_Browse.001_2065642654_1.BINARY', 'rb')
out= open ('C:\Users\Umberto\Desktop\Prove_Script\Varie\preview.txt', 'wb')
pickle.dump (binary, out, 1)

TypeError                                 Traceback (most recent call last)
<ipython-input-6-981b17a6ad99> in <module>()
----> 1 pprint.pprint (pickle.dump (binary, out, 1))

C:\Python27\ArcGIS10.1\lib\copy_reg.pyc in _reduce_ex(self, proto)
     68     else:
     69         if base is self.__class__:
---> 70             raise TypeError, "can't pickle %s objects" % base.__name__
     71         state = base(self)
     72     args = (self.__class__, base, state)

TypeError: can't pickle file objects

我没有得到的另一件事是,如果我应该创建一个指向的文件(在我的情况下,我必须创建“out”,否则我不会为 pickle 方法提供正确的参数)或这不是必需的。 希望我能接近解决方案。

P.S.:我也尝试了 pickle.dumps (),但没有达到更好的结果......

【问题讨论】:

write 以何种方式不能用于字符串?在任何情况下,如果您想将列表等保存到文件中,最好使用pickle,但这与使用 JPEG 或其他二进制文件完全不同 我将编辑我的问题,以便您可以看到我正在尝试做什么,即使我知道我使用 '.write ()' 模块的部分是完全错误的,因为我仍然不知道不知道怎么用... 你能显示你正在尝试的代码吗?否则无法回答这个问题。 您需要打开一个文件句柄来写入 - 类似outf = open(newpath, "w"),然后执行outf.write(edit_data),然后执行outf.close()。您不会从字符串本身调用write。你看出区别了吗? 【参考方案1】:

如果您打开一个二进制文件并保存另一个二进制文件,您可以这样做:

with open('file.jpg', 'rb') as jpgFile:
    contents = jpgFile.read()

contents = (some operations here)

with open('file2.jpg', 'wb') as jpgFile:
    jpgFile.write(contents)

一些cmets:

“rb”和“wb”分别表示以二进制模式读取和写入。详细了解为什么在处理二进制文件时建议使用“b”here。 Python 的with statement 负责在退出块时关闭文件。

如果您需要保存列表、字符串或其他对象,并在以后检索它们,请使用pickle,正如其他人指出的那样。

【讨论】:

我认为如果您至少提供一点解释和/或文档链接,这个答案会更好。我相信很多初学者都会想知道'rb''wb' 字符串的作用是什么。 这是一个更好的答案。干得好。 感谢这个答案和大卫罗宾逊的评论,我成功地管理了它(通过 .write () 方法)!唯一仍不清楚的是,为什么当我在十六进制编辑器中打开我拥有的两个二进制文件(原始文件和新文件)时,尽管我没有编辑任何内容,但它们看起来略有不同(因为我的只是尝试了解保存过程的工作原理)。有什么线索吗?再次感谢您的宝贵努力!!!!【参考方案2】:

您可以使用名为“pickle”的标准 python 模块。

你可以在这里阅读:pickle documentation

读写任何数据结构都会很容易

pickle.dump(obj, file_handler) # for serialize object to file
pickle.load(file)              # for deserialize from file

或者您可以序列化为字符串:pickle.dumps(..) 并从中加载:pickle.loads(...)

【讨论】:

我想我会在 pickle 模块上记录,因为我的 jpeg 是二进制格式,当我尝试按照您的建议运行脚本时,它会输出一个错误,说“TypeError:必须是字符串或缓冲区,而不是文件”。还是谢谢你! 当然你不能用pickle从其他格式加载数据。它们仅加载使用 pickle.dump 保存的文件,并以指定格式存储数据。您的第一个问题是“如何保存和加载字符串和其他结构”-pickle 是最简单的方法 我修改了文档,并尝试腌制我的文件,但收到错误消息。我正在更新我的问题,以便您知道我一直在尝试什么。 好的,对于您的问题,您需要使用 Diego Herranz 的答案。因为pickle以自己的格式保存数据,这不是你想要的。

以上是关于在python中将字符串保存到二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中将浮点数列表输出到二进制文件

在 Python 中将 PNG 转换为二进制(base 2)字符串

如何在 .NET 中将自定义类型保存为二进制数据?

Python:将十六进制字符串保存到jpg图像文件

在 gdb 中将某段内存 dump 保存到文件中

初学Python写二进制文件