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

标签 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.png5 FR314FTeihwfwData\图像\medal1.png5FR0FTeihwfwData\图像\medal2.png5FR0FTeihwfwData\图像\medal3.png5FR0FTeihwfwData\图像\medal4.png5FR0FTeihwfwData\图像\player1.png5FR0FTeihwfwData\图像\player2.png5FR0FTeihwfwData\图像\player3.png5FR0FTeihwfwData\图像\playerdead.png5FR0FT eihwfwData\images\scorereward.png5FR0FTeihwfwData\images\开始.png5FR239FTeihwfw

偏移量和数据长度似乎也很困惑。 我该如何解决这一切? 非常感谢!

编辑:这个问题已被@XavierCbelle修复,但是当我想要加载图像时遇到了新问题,例如列表中的第一个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...')

最佳答案

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()) 从文件末尾开始,什么也不返回(所以长度= 0)。尝试一下:

dataLength = data.tell()

关于python - 如何将png文件放入字符串并将其写入另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25108126/

相关文章:

python - 如何仅使用循环将 n×m 矩阵转置为新的 m×n 矩阵?

python - 使用 ctypes 从无效函数(段错误)x64 获取指针

java - ImageView 在 Android 中不起作用

reactjs - 如何使用 React 检查文件扩展名

node.js - 如何在路径中创建文件夹?

python - 我在更新 pip 以安装 python 包时遇到问题

image - 如何正确添加资源(*.res)文件到组件包中?

javascript - 如何在 NodeJS 中创建带有路径的文件对象?

C、MS Windows系统创建临时文件

python - 如何在python中实现平滑的钳位功能?