2013-03-05 111 views
1

我正在处理二进制文件。它们是jpeg图像。 我需要用Python编辑它们并保存它们。 我一直在使用这个脚本,并且似乎正常工作为止:写入文件夹时文件更改

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= open (newpath+ '/preview.BINARY', 'w') 

# do my edits in a secon time... 

out.write (edit_data) 
data.close() 
out.close() 

无论如何,出了问题(出的Python)arised:我的两个文件都应该是一样的,但他们都没有!通过在一个十六进制编辑器中打开他们,他们看起来有些不同(原始文件比新文件更小,即163KB,agaist 167)。 此外,当我打开它们时,它们是不同的。他们仍然被视为图像,但一看起来很好(原来的),而另一个是完全混乱... 出了什么问题?我正在使用的代码是否改变了我不知道的东西,如果是的话,是什么? 我希望你能帮助我。

+1

为什么你希望这两个文件是一样的吗?你打开一个文件,彻底改变它,然后保存它 - 当然它会有所不同。 – danodonovan 2013-03-05 11:23:06

回答

2

你不说你做的

# do my edits in a secon time...

但姑且不论,行

edit_data= str (data.read()) 

将相当彻底改变你的数据。你正在打开一个二进制文件,将内容转换为一个字符串,然后将内容保存到一个不同的文件中,这样就会变为

edit_data = data.read() 

更改为上面会解决您所提供的片断,但如果你正在编辑的数据在其他地方这也改变的事情。

建议

如果你将要编辑二进制文件很多,可能是使用with语法

with open(my_file, 'rb+') as fo: 
    edit_data = fo.read() 

,然后你不必是个好主意担心关闭文件等。一旦你有edit_data,这将是再次保存数据

with open(my_out_file, 'wb') as fo: 
    fo.write(edit_data) 

更清洁和更简单之前,你可以就地编辑字节数组!

+0

感谢您指点。关于编辑的评论意味着我没有做任何实际的事情,只是尝试将原始文件写入文件夹。无论如何,我想将它转换为字符串,因为编辑它会容易得多,我是编程人员的新手。你的方法给了我正确的结果,所以谢谢,我现在猜测如果我可以编辑这些二进制文件就像编辑字符串一样简单,但我会尝试管理它。再次感谢。 – umbe1987 2013-03-05 11:32:42

+0

在Python 2.x中,file.read()已经返回一个'str'。 – 2013-03-05 11:49:10

+0

非常感谢你,这应该是完美的我的目的! – umbe1987 2013-03-05 12:22:26

2

使用二进制模式:

open (newpath+ '/preview.BINARY', 'wb') 
+0

你说得对,谢谢你! – umbe1987 2013-03-05 12:22:42