我将详细描述我的问题:
首先,我正在从CSV文件中读取一些值:
def import_csv(my_csv_file):
with open(my_file, mode='r') as infile:
reader = csv.reader(infile)
next(reader) # Ignore the first row
return dict((rows[0]+struct.pack('!L',int(rows[1])), [rows[2],rows[3]]) for rows in reader)
然后我将此函数称为:
DB = import_csv(my_csv_file)
my_csv_file中的每一行都具有以下格式:
40.1.1.2,1,\ x00123,bbbbbbbbbbbbbbbb
导入后,我得到一个dict元素:
value = DB['40.1.1.2\x00\x00\x00\x01'][0]
但现在我需要将值(包含字符串\ x00123)转换为其ASCII等效值,其中前缀为\ x的任何两个字符表示HEX值。也就是说,对于上面的例子,我想要
\ x00123 = 00313233
我尝试过使用binascii.hexlify命令,但是它在读取字符串中给出了等效于每个字符的ASCII,即:
binascii.hexlify(value)= 5c783030313233
如果我这样做:
value_0 = '\x00123'
print binascii.hexlify(value_0)
我得到了所需的结果,即00313233.所以看起来在读取文件中的值后,十六进制转义字符\ x被视为字符串中的值。请注意,包括例如\ x00部分是在我将从文件中读取的值中包含不可打印的字符。
有什么办法可以做我想要的吗?谢谢!
答案 0 :(得分:0)
为什么不在创建字典时添加转换?使用decode('string_escape')
处理任何\x
,然后.encode('hex')
将其转换回十六进制:
import csv
import struct
def import_csv(my_csv_file):
with open(my_csv_file, mode='rb') as infile:
reader = csv.reader(infile)
next(reader) # Ignore the first row
return dict((row[0] + struct.pack('!L', int(row[1])), [row[2].decode('string_escape').encode('hex'), row[3]]) for row in reader)
DB = import_csv('input.csv')
value = DB['40.1.1.2\x00\x00\x00\x01'][0]
print value
这会显示:
00313233