4

3列のcsvファイルがあります。2 番目の列で特定の値 (16 進数値) を検索し、その行の次のエントリ (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 つのエントリのいずれかを検索しようとすると、何も読み戻されません (出力の [])。私のコードは以下のとおりです。バグが何であるかを知っている人はいますか?

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
4

5 に答える 5

7

hex(0x 0 4413053) は「0x4413053」

おそらく逆を行う必要があります。

int(line[clolumn1], 16) == 0x04413053
于 2012-05-25T20:31:23.017 に答える
1

どちらの場合も、for ステートメントのすべての値を読み通す必要はありません。ただ行う:

for line in reader:
    if line[column1] == hexvalue:
        entry = line[column2]
        break # efficient!
print entry
于 2012-05-25T20:36:09.477 に答える
0

すべての例を試した後、以下の作業コードにたどり着きました。

Anthon は、値についてリストを 1 回だけ並べ替える必要があるという点で正しかったです。私の場合、繰り返しパターンはありません。探していた 16 進値を見つけるために、MK からの入力を追加するように Anthon を変更する必要がありました。

助けてくれてありがとう。

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
于 2012-05-25T21:26:13.970 に答える
0

MK's fine answerで指摘されたタイプの問題に加えて、あなたが提起した 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)
于 2012-05-25T20:58:47.457 に答える
0

問題は 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

上記のコードは、同じタイプを比較する必要があることを示しています。これは次のように書き換えることができます:
(FYI:int(line[column1], 16)文字列を 16 進数に変換します)

  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
于 2012-05-25T21:00:07.677 に答える