提供此文件(utf8):
00000000 30 31 3a 32 35 20 e2 87 92 20 31 32 2f 32 34 2f |01:25 ... 12/24/|
00000010 32 30 31 39 20 e2 87 89 30 31 3a 33 31 20 44 49 |2019 ...01:31 DI|
00000020 53 4b 20 46 20 e2 99 a3 20 0d 0a |SK F ... ..|
我的目的是获取文件或字节串,并将其转换为十六进制表示形式。 我创建了以下代码:
def c2h(data):
def c2h(c):
hb = hex(ord(c)).replace('0x','')
return hb if len(hb) == 2 else ''.join('0'+hb)
strbuf = []
i = 0
for c in data:
if ord(c) > 255:
raise ValueError("ord value of char @ position:{:2d} is > 255".format(i))
strbuf.append(c2h(c))
i += 1
return ''.join(strbuf)
然后我获取了上面的代码,并在Mac,Windows和Linux中运行了它。这是结果。
Mac:Python 2.7.16
>>> file = '/Volumes/TEMP/KDACCT.TXT'
>>> f = open(file, 'r')
>>> s1 = f.read().rstrip('\r\n')
>>> s1
'01:25 \xe2\x87\x92 12/24/2019 \xe2\x87\x8901:31 DISK F \xe2\x99\xa3 '
>>> c2h(s1)
'30313a323520e287922031322f32342f3230313920e2878930313a3331204449534b204620e299a320'
我得到了期望的结果,但是,如果在Windows或Linux中使用相同的文件,则会出现ValueError。
这是Windows交互: Windows:Python 3.6.8
>>> file = 'c:\\temp\\kdacct.txt'
>>> f = open(file, 'r')
>>> s1 = f.read().rstrip('\r\n')
>>> s1
'01:25 ⇒ 12/24/2019 ⇉01:31 DISK F ♣ '
>>> c2h(s1)
I get ValueError: ord value of char @ position:10 is > 255
请注意,Windows将存储BOM。
这是Linux交互: Linux:Python 3.6.8
>>> file = '/media/sf_Linux_SHR/KDACCT.TXT'
>>> f = open(file, 'r')
>>> s1 = f.read().rstrip('\r\n')
>>> s1
'01:25 ⇒ 12/24/2019 ⇉01:31 DISK F ♣ '
>>> c2h(s1)
I get ValueError: ord value of char @ position: 6 is > 255
我的问题是,如何在Windows / Linux中获得与在Mac上相同的结果。 我认为这与编码有关,我只是想不出需要做什么。
答案 0 :(得分:0)
这里有一些问题在起作用
rb
代替r
作为open()
的参数这是一个对两个都适用的版本:
from __future__ import print_function
with open('/Volumes/TEMP/KDACCT.TXT', 'rb') as fh:
characters = bytearray(fh.read())
for character in characters:
print('%02x' % character, end='')