2013-03-04 74 views
-1

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

UPDATE

这里是我试图运行脚本:

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

我试图使用泡菜模块连载我的二进制文件,修改并保存到了最后,但还是没有得到它的工作......这就是我一直在试图至今:

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方法的正确参数),或者没有必要。 希望我正在接近解决方案。

PS:我也试图与pickle.dumps(),没有实现虽然更好的结果...

+0

'write'不能用字符串工作?无论如何,如果你想将列表等保存到一个文件中,最好使用[pickle](http://docs.python.org/2/library/pickle.html),但这与工作完全不同与JPEG或其他二进制文件 – 2013-03-04 15:40:00

+0

我会编辑我的问题,以便您可以看到我想要做什么,即使我知道我使用'.write()'模块的部分是完全错误的,因为我仍然不知道不知道如何使用它... – umbe1987 2013-03-04 15:44:27

+0

你可以显示你正在尝试的代码吗?否则无法回答这个问题。 – 2013-03-04 15:45:05

回答

4

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

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'的更多信息here
  • Python的with statement负责在退出块时关闭文件。

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

+0

我认为如果您至少给出了一点解释和/或文档链接,这个答案会更好。我相信很多初学者会想知道“rb''和”wb''这两个字符串的用途。 – 2013-03-04 15:48:15

+0

你说得对,我会编辑它并添加一些评论。 – 2013-03-04 15:49:03

+0

现在这是一个更好的答案。不错的工作。 – 2013-03-04 16:10:46

0

您可以使用名为“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(...)

+0

我认为我将在pickle模块上创建文档,因为我的jpegs是二进制格式,当我尝试按照您的建议运行脚本时,它会输出一个错误,说“TypeError:必须是字符串或缓冲区,而不是文件”。不管怎样,谢谢你! – umbe1987 2013-03-04 16:08:38

+0

当然你不能用pickle加载其他格式的数据。它们只加载用pickle.dump保存的文件,并以指定的格式存储数据。你的第一个问题是“我怎样才能保存和加载字符串和其他结构” - 咸菜是最简单的方法 – Elephant 2013-03-04 16:19:42

+0

我冲掉了文档,并试图腌制我的文件,接收到一个错误。我正在更新我的问题,以便您知道我一直在尝试的内容。 – umbe1987 2013-03-05 09:40:12