使用python在csv中搜索十六进制数据
我有一个csv文件,它有3列。我试图在第二列中搜索特定值(十六进制值),并读取该行的下一个条目(第3列)。格式如下所示:使用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
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