如何将png文件放入字符串并将其写入另一个文件

时间:2014-08-03 19:10:24

标签: python image file python-2.7 file-io

我试图制作数据存档,但我的data.gdf不是它应该如何,data.gdf是所有文件的串联,所有文件都是一个接一个地存储而没有任何分隔符。 data.gdh中存储的起始偏移量和长度显然非常关键,如果任何无效,则无法再提取损坏记录所描述的文件,显然所有下一个文件也可能无法提取。现在,我正在尝试使用png文件创建数据存档,但它似乎并不安静。

import os

#--------Encryption/Decryption of data---------#
hidden
#--------Encryption/Decryption of data---------#
#                                              #
#--------------------Main----------------------#

with open('Output//data.gdf', 'w') as gdf: # clean data.gdf
    gdf.write('')

files = []
for (path, dirnames, filenames) in os.walk('Data'):
    files.extend(os.path.join(path, name) for name in filenames)

file_data = 'YwuiHg'
for i in files:
    with open(i, 'r') as data:
        with open('Output//data.gdf', 'r') as gdf:
            dataOffset = len(gdf.read())
        with open('Output//data.gdf', 'w') as gdf:
            gdf.write(data.read())
        dataLength = len(data.read())
        file_data += i + str(dataOffset) + 'FR' + str(dataLength) + 'FT' + 'eihwfw'
print file_data
with open('Output//data.gdh', 'w') as gdh:
    gdh.write(encrypt(key, file_data))

打印file_data时:

YwuiHgData\images\background.png0FR1749FTeihwfwData\images\background1.png5FR354FTeihwfwData\images\gameover.png5FR0FTeihwfwData\images\ground.png5FR1571FTeihwfwData\images\icon.png5FR599FTeihwfwData\images\loadbackground.png5FR314FTeihwfwData\images\medal1.png5FR0FTeihwfwData\images\medal2.png5FR0FTeihwfwData\images\medal3.png5FR0FTeihwfwData\images\medal4.png5FR0FTeihwfwData\images\player1.png5FR0FTeihwfwData\images\player2.png5FR0FTeihwfwData\images\player3.png5FR0FTeihwfwData\images\playerdead.png5FR0FTeihwfwData\images\scorereward.png5FR0FTeihwfwData\images\start.png5FR239FTeihwfw

偏移和数据长度似乎也搞砸了。 我该如何解决这一切? 非常感谢!

编辑:这个问题已由@XavierCombelle修复,但是当我想加载图片时遇到了一个新问题,例如列表background.png中的第一个图像。当我将其完整路径Data\images\background.png放置时,它找不到路径但是当我只是简单地放置background.png时,这是否与\作为转义码或这样的事情?我自己固定:

try:
    os.remove('Output//data.gdf')
except:
    'file does not exist, no need to delete'    

files = []
for (path, dirnames, filenames) in os.walk('Data'):
    files.extend(os.path.join(path, name) for name in filenames)

file_data = 'YwuiHg'
#ab mode writes to the end of the file so need to have clean file when beginning to make new data.gdf otherwise the whole file would be messed up.
print 'Opening data.gdf for writing...\n'
with open('Output//data.gdf', 'ab') as gdf:            
    for i in files:
        i.replace("\ ","\\")
        with open(i, 'rb') as data_file:
            data = data_file.read()
            dataOffset = str(gdf.tell())
            dataLength = str(len(data))
            print 'Writing to data.gdf ' + i + ' at offset ' + dataOffset + '. Data Length ' + dataLength
            gdf.write(data)
            print 'Storing identity of data into file_data -> ' + i + dataOffset + 'FR' + dataLength + 'FT' + 'eihwfw\n'
            file_data += i + dataOffset + 'FR' + dataLength + 'FT' + 'eihwfw'

print 'Encrypting file_data variable and writing it to data.gdh'
with open('Output//data.gdh', 'w') as gdh:
    gdh.write(encrypt(key, file_data))

exiting = raw_input('Press any key to continue...')

2 个答案:

答案 0 :(得分:1)

open('Output//data.gdf', 'w')将截断输出文件,丢失您已写入的数据。因此,您的偏移量始终是前一个条目的长度(文件内容的其余部分每次都会丢失)。

您可以将输出文件上的两个open()调用简化为单个调用,并切换到追加:

with open('Output//data.gdf', 'a') as gdf:
  dataOffset = gdf.tell()
  gdf.write(data.read())

数据长度搞乱了,因为第一个data.read()一直读到数据文件的末尾,因此len(data.read())从文件末尾开始并且什么都不返回(所以len = 0)。请尝试改为:

dataLength = data.tell()

答案 1 :(得分:1)

首先,您必须设置二进制模式(" rb"或" wb"对于任何非文本文件)

每次使用" r"打开文件时或" w" (甚至" rb"或" wb")它重置为开始

要拥有一个文件的dataOffset,你可以调用tell()方法

当你执行data.read()时,它会占用所有文件,因此后续读取返回一个长度为0的空字符串

因此核心循环可以替换为

#wb mode reset data.gdf so no need to doing previous write
with open('Output//data.gdf', 'wb') as gdf:            
    for i in files:
        with open(i, 'rb') as data_file:
            data = data_file.read()
            dataOffset = gdf.tell()
            gdf.write(data)
            dataLength = len(data)
            file_data += i + str(dataOffset) + 'FR' + str(dataLength) + 'FT' + 'eihwfw'

gdf文件格式看起来很奇怪,例如,如果你有一个名为127FR49FTeihwfw.png的文件会发生奇怪的事情