使用python在csv中搜索十六进制数据

使用python在csv中搜索十六进制数据,python,csv,Python,Csv,我有一个csv文件,它有3列。我试图在第二列中搜索特定值(十六进制值),并读取该行的下一个条目(第3列)。格式如下所示: Text1, 0x04d0a053, value1 Text2, 0x04d01053, value2 Text3, 0x04d03053, value3 Text4, 0x04d05053, value4 Text5, 0x04d00053, value5 Text6, 0x04d02053, value6 Text7, 0x04d04053, value7

我有一个csv文件,它有3列。我试图在第二列中搜索特定值(十六进制值),并读取该行的下一个条目(第3列)。格式如下所示:

Text1,  0x04d0a053, value1
Text2,  0x04d01053, value2
Text3,  0x04d03053, value3
Text4,  0x04d05053, value4
Text5,  0x04d00053, value5
Text6,  0x04d02053, value6
Text7,  0x04d04053, value7
Text8,  0x04413053, value8
我可以搜索和读取最后一个值(0x04413053)并打印“value8”。但是,当我尝试搜索前7个条目中的任何一个时,都不会读回任何内容([]在输出上)。下面是我的代码,有人知道这个bug是什么吗

fileInput = 'mycsv.csv'
column0 = 0
column1 = 1
column2 = 2

#reads correctly
hexvalue = hex(0x04413053)
with open(fileInput, 'r') as file:
  reader = csv.reader(file)
  entry = [line[column2] for line in reader if line[column1] == hexvalue]
  print entry

#does not read correctly
hexvalue = hex(0x04d0a053)
with open(fileInput, 'r') as file:
  reader = csv.reader(file)
  entry = [line[column2] for line in reader if line[column1] == hexvalue]
  print entry
十六进制(0x04413053)是“0x4413053”

你可能应该做相反的事情,即

int(line[clolumn1], 16) == 0x04413053

在这两种情况下,您都通读了for语句中的所有值,但不应该这样做。 只要做:


除了在中指出的类型问题外,我注意到您提出的csv示例存在一些空格问题,这些问题会破坏您的代码。以下是我的解决方案:

fileInput = 'mycsv.csv'

# Sniff csv format to easily avoid whitespace issue.
with open(fileInput, 'r') as afile: # 'file' is a python keyword. Best to avoid overriding it.
    snift = csv.Sniffer().sniff(afile.readline())

# get the answers in a single pass at the file.
# If that doesn't work for you, fine, but try to avoid opening the file twice.
hexvalues = set([0x04413053, 0x04d0a053])
with open(fileInput, 'r') as afile:
  reader = csv.reader(afile, dialect=snift)
  entries = [line[2] for line in reader if int(line[1], 16) in hexvalues]

print '\n'.join(entries)

问题出在if条件下。您没有比较相同的值

  hex_string = "0x04413053"
  with open(fileInput, 'r') as file:
    reader = csv.reader(file)
    entry = [line[column2] for line in reader if int(line[column1], 16) == int(hex_string, 16)]
    print entry
上面的代码显示您应该比较相同的类型。这可以重写为:
(仅供参考:
int(第[column1]行,16)
将字符串转换为十六进制)


在研究了所有示例之后,我得到了以下工作代码:

Anthon是正确的,因为我只需要对列表中的值进行一次排序,在我的情况下,不会有重复的模式。我不得不修改Anthon,添加来自MK的输入,以查找我正在搜索的十六进制值

谢谢你的帮助

hexvalue = 0x04d03053
with open(fileInput, 'r') as file:
    reader = csv.reader(file)    
    for line in reader:
        if int(line[column1], 16) == hexvalue:
            entry = line[column2]
            break # efficient!
    print entry

取决于您想要的是匹配的所有值,还是仅第一个值。@StuCox您是对的。我假设column1的值都是不同的(如示例中所示),在这种情况下,
line[column1]==hexvalue
只能有一个匹配项。您的CSV文件在逗号和类似的值之间是否实际有空格
csv.reader
不会自动修剪空白。我在尝试第二个示例ValueError:invalid literal for int()和base 16时收到此错误:“”您确定csv文件包含有效数据吗?
  hexvalue = 0x04413053
  with open(fileInput, 'r') as file:
    reader = csv.reader(file)
    entry = [line[column2] for line in reader if int(line[column1], 16) == hexvalue]
    print entry
hexvalue = 0x04d03053
with open(fileInput, 'r') as file:
    reader = csv.reader(file)    
    for line in reader:
        if int(line[column1], 16) == hexvalue:
            entry = line[column2]
            break # efficient!
    print entry