0

何らかの理由で、私のコードは 10 桁の数字すべてで機能しますが、3 ~ 4 桁の数字では機能しません。ロジックのどこが間違っているかを確認できるように、これを単純化するためのサンプル コンセプトを作成しました。しかし、私のサンプルは完全に機能しますが、実際のコードは機能しません。私の結論は、SQLiteまたはCSVからデータを読み取るものでなければならないということです。これはうまく機能するサンプルコンセプトコードです:

test_list = [ (1, 1234567890), (2, 987654321), (3, 123), (4, 4567) ]
# showing all contents
print test_list

# proving it is a list
print type(test_list)

# comparison list
new_list = [ 1234567890, 987654321, 123, 4567, 1567839890, 987654321 ]

# find k given matching v
for num in new_list:
  for k, v in test_list:
    if v == num:
      print 'the key of ' + str(num) + ' = ' + str(k)

動作しないコードは次のとおりです。

def populateTextMsgs(csvfile, db):
  conn = sqlite3.connect(db)
  conn.text_factory = str  # 8-bit bytestrings
  cur = conn.cursor()

  # get subscribers and write to subscriber_list, no problems here
  cur.execute('SELECT subscriber_id, phone_number FROM subscriber')
  subscriber_list = cur.fetchall()  # this is getting all the subscribers

  # no problems here
  # read values from tab-delimited csv file
  i = 1  # do not use first line (contains headers)
  reader = csv.reader(open(csvfile, "rU"), delimiter = '\t')
  for Number, Name, Message, Datetime, Type in reader:
    # check to ensure name/number not null and not first record
    if Number and Name and i > 1:
      # if number starts with '1' then remove first digit
      if str(Number)[0] == '1':
        Number = int(str(Number)[1:])

      # this is where I think the problem is, but cannot figure out why
      # return subscriber_id (sid) given phone number
      for sid, num in subscriber_list:
        if num == Number:
          # insert messages into textmsg table
          cur.execute('INSERT OR IGNORE INTO textmsg (subscriber_id, msg, datetime, type) VALUES (?,?,?,?)', (sid, Message, Datetime, Type))
          conn.commit()

    i += 1  # iterator to ensure first line is not used but others are

  cur.close()
  conn.close()
  print '...Successfully populated textmsg table.'

これはすべての長い数値で機能しますが、短い数値ではデータを取得できません。なんで?

4

1 に答える 1

1

単純に置き換えるだけif num == Number:if num == int(Number):うまくいくはずです。すでにそれらの一部、1で始まるものは変換していましたが、他は変換していません.csvリーダーは文字列のみを返しますが、sqliteは列に応じて異なるタイプを返します...したがって、文字列を比較していましたそしてint ...

于 2012-06-14T04:07:29.640 に答える