在Python中将字符串保存为二进制文件

1 投票
2 回答
9312 浏览
提问于 2025-04-17 17:53

我想了解一个非常基础的Python编程问题,因为我现在的编程水平很初级:我该如何把一个结果(比如列表、字符串或其他东西)保存到文件中呢?我搜索了很多,但没有找到好的答案。我在想“.write()”这个方法,但(例如)它似乎对字符串不起作用,我也不知道它到底是干什么的。

所以,我的情况是我有一些二进制文件,我想编辑它们,因此我发现把它们转换成字符串比较简单,修改后,现在我想把它们 i) 再保存回二进制文件(比如jpeg图片),以及 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'

更新_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方法),还是说这不是必要的。希望我离解决方案不远了。

附言:我也尝试过使用pickle.dumps(),但结果也不太理想……

2 个回答

0

你可以使用一个叫“pickle”的标准Python模块。

你可以在这里了解它:pickle文档

读取和写入任何数据结构都非常简单。

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

或者你可以把数据转换成字符串:使用pickle.dumps(..),然后再从字符串中加载数据:使用pickle.loads(...)。

9

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

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

contents = (some operations here)

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

一些说明:

  • 'rb' 和 'wb' 分别表示以二进制模式读取和写入文件。关于为什么在处理二进制文件时推荐使用'b',你可以在这里找到更多信息。
  • Python的with语句会在你离开这个代码块时自动关闭文件。

如果你需要保存列表、字符串或其他对象,并且想要在之后取出来,可以使用pickle,正如其他人提到的那样。

撰写回答