質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3780閲覧

【python】リストに格納された16進数文字列を数値に変換する方法が知りたいです。

ak_

総合スコア12

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/12 08:10

各成分が16進数8桁で記載されたファイルを文字列のリストとして読み込んで、
そのリスト形状を変換した後に、文字列を16進数の数値に変換しようとしています。
下記コードの3行目までは、所望の動きをしているように見えるのですが、
4行目でエラーが発生します。

どのように書けば、16進数文字列を数値に変換してくれるのでしょうか。

■読み込んだファイル(data_hex.csv)
"21460000 0610105a 1a77780a0 8014a66b a167281f 0c0d0615"
"0aa43400 103a505a 5a66780a0 0015696b b1649819 8c0d7812"
"25523400 616a505a 8a55780a0 9011036b c6478814 2c0d0513"
"62707632 797a141a 2a24760a0 7014915b a961231f 580d0314"

python3

1a = np.loadtxt('data_hex.csv',delimiter='\t', dtype='unicode') 2x = a.reshape(-1, 2) 3x0, x1 = np.hsplit(x, 2) 4x0_i = [int(s, 16) for s in x0] 5

■エラー
int() can't convert non-string with explicit base
このようなエラーが出ますが、3行目・4行目間で str(x0)
を挿入しても同じ結果になるため、リスト成分自体は文字列なのかと思います…。
読み込み時のdtype='unicode'が悪いのかと思ったのですが、
それ以外で16進数を読み込むことができなかったためこの個所は調査できていないです。

■環境
jupyter notebook

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

以下のように修正でいかがでしょう?

修正前

python

1x0_i = [int(s, 16) for s in x0]

修正後

python

1import re 2 3x0_i = [[int(s, 16) for s in re.split(r'\s+', e[0])] for e in x0]

投稿2020/04/12 08:43

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ak_

2020/04/12 12:23

回答ありがとうございます。 うまくいっていること、確認できました。 reについても初めて知りましたので、勉強してみます!
jun68ykt

2020/04/12 12:33

どういたしまして > うまくいっていること、確認できました。 とのことでよかったです???? > reについても初めて知りましたので、勉強してみます! re は正規表現モジュールです。 https://docs.python.org/ja/3/library/re.html このご質問のように、テキストファイルを読み込んで、 NumPy だったり Pandas だったりで、何か目的の処理をさせようとする前に、読み込んだテキストデータを整えなければならない場合があります。その際、正規表現(および正規表現を使った関数)を使えると、楽に切り抜けられることも多いです。
guest

0

元データの各行が"で囲われているため、ソース2行目以降が意図しない結果になっています。
pandasを使うと以下のように書けます。

Python

1import pandas as pd 2 3df = pd.read_csv('data_hex.csv', header=None) 4 5def func(row): 6 l = row[0].split('\t') 7 l = [int(e,16) for e in l] 8 return pd.Series(l) 9 10df = df.apply(func, axis=1) 11a = df.values 12print(a) 13#[[ 558235648 101716058 7104594080 2148836971 2707892255 202180117] 14# [ 178533376 272257114 24266637472 1403243 2976159769 2349692946] 15# [ 626144256 1634357338 37133713568 2417034091 3326576660 739050771] 16# [ 1651537458 2038043674 11312521376 1880396123 2841715487 1477247764]]

投稿2020/04/12 09:04

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ak_

2020/04/12 12:28

回答ありがとうございます。 元データが悪い(コードが対応できていない)のは想定外でした汗 pandasも勉強してみます!
guest

0

ベストアンサー

x0の中身を見てみましょう。

[['"21460000 0610105a 1a77780a0 8014a66b a167281f 0c0d0615"'] ['"25523400 616a505a 8a55780a0 9011036b c6478814 2c0d0513"']]

2次元のリストになっています。
この状態で内包表式内のsとして渡されるのは、

['"21460000 0610105a 1a77780a0 8014a66b a167281f 0c0d0615"']

などのリストです。int(s, 16)の引数には'0610105a'といった形で渡さないといけないのでそのように書き換えてみてください。reshapeしている意図はわかりませんが、mapやsplitなどを使えばできます。
変数を逐一printで確認するのも理解の助けになりますよ。

投稿2020/04/12 08:36

編集2020/04/12 08:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ak_

2020/04/12 09:05

回答ありがとうございます。 間違っていた場所を理解することができました。 reshapeしているのは、各要素2個ごとに共通の意味をもったデータが構成されているためで、 共通のデータを一括りにした方が処理しやすいと思ったからです。 (身長 体重 身長 体重…みたいなデータに対して、身長だけのリストと体重だけのリストに 分けたかって解析したかったイメージです。) mapやsplitについても無知なので調べてみます。
退会済みユーザー

退会済みユーザー

2020/04/12 09:19

なるほど理解できました。 numpyは確かに便利ですが、標準の関数を組み合わせて処理をするとテクニックの幅が広がっていいと思います。atcoderなどで楽しく学ぶのがおすすめです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問