我目前正在试验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)
。
答案 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()
。二进制文件不需要编码和/或解码 - 它们是原始数据。