将更多数据写入文件而不是读取?

时间:2016-04-16 16:07:24

标签: python python-3.x read-write bytestream

我目前正在试验Python 3在阅读和处理数据时如何处理字节,我遇到了一个特别令人不安的问题,我似乎无法找到它的来源。我正在低音读取JPEG文件中的字节,使用 $('.select-child').each(function () { $(this).prop('checked', checked); if (checked) { $(this).parent().parent().addClass('warning'); } else { $(this).parent().parent().removeClass('warning'); } }); }); $('body').on('click', '.table-selectable tbody tr', function (e) { var checkbox = $(this).find('.select-child'); //Old code commented: //checkbox.click(); //Modified Code: checked.click(); var checked = checkbox[0].checked; if (checked) { $(this).addClass('warning'); } else { $(this).removeClass('warning'); } }); $('body').on('change', '.select-child', function (e) { var checked_total = $('.select-child:checked').length; if (checked_total == $('.select-child').length) { $('.select-all-children').prop('checked', true); } else { $('.select-all-children').prop('checked', false); } }); 将它们转换为整数,然后使用行ord()将字节返回到原始字符并将其写回JPEG文件。没问题吧?好吧,当我去尝试打开JPEG文件时,我收到一条Windows 8.1通知,说它无法打开照片。当我互相检查两个文件时,一个是5.04MB,另一个是7.63MB,这让我非常困惑。

chr(character).encode('utf-8')

这是我正在使用的确切代码,有关正在发生的事情以及如何解决问题的任何想法?

注意:我假设def __main__(): operating_file = open('photo.jpg', 'rb') while True: data_chunk = operating_file.read(64*1024) if len(data_chunk) == 0: print('COMPLETE') break else: new_operation = open('newFile.txt', 'ab') for character in list(data_chunk): new_operation.write(chr(character).encode('utf-8')) if __name__ == '__main__': __main__() 提供的数字列表相当于list(data_chunk)

2 个答案:

答案 0 :(得分:2)

以下是您可能希望使用的简单示例:

import sys

f = open('gash.txt', 'rb')
stuff=f.read()    # stuff refers to a bytes object
f.close()

print(stuff)

f2 = open('gash2.txt', 'wb')

for i in stuff:
    f2.write(i.to_bytes(1, sys.byteorder))

f2.close()

如您所见,bytes对象是可迭代的,但在for循环中,我们在int中返回i。要将其转换为字节,我使用int.to_bytes()方法。

答案 1 :(得分:0)

当你有一个代码点并用UTF-8编码时,结果可能包含比原始字节更多的字节。

有关具体示例,请参阅WikiPedia page并考虑十六进制值0xA2

这是一个小于255的单个二进制值,但当编码为UTF8时,它变为0xC2, 0xA2

鉴于您要从源文件中提取字节,我的第一个建议是将字节直接传递给目标文件的编写器。

如果您正在尝试了解文件I / O的工作方式,请在使用二进制文件模式时警惕encode()。二进制文件不需要编码和/或解码 - 它们是原始数据。