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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

1回答

1018閲覧

python list index out of range

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2021/11/08 23:58

IPスキャナーを自作してみましたが、
elem = elems[6].split('n')
でエラー(list index out of range)となってしまっております。

どうしても解決できない状況です。

python

1 2import re 3import socket 4import subprocess 5import pandas as pd 6 7# IPアドレス生成 8def ip_genarate(): 9 ip_list =[] 10 for i in range(1, 5): 11 res = f'10.2.0.{i}' 12 ip_list.append(res) 13 14 return ip_list 15 16 17def reserch(target): 18 19 ip = [] 20 mac = [] 21 host = [] 22 23 # 生成したIPアドレスにPing実行 24 for target_ip in target: 25 ping_res = subprocess.run(['ping', target_ip], shell= True, stdout=subprocess.PIPE) 26 ping_result = ping_res.stdout.decode('cp932').find('TTL') 27 # print(ping_result) 28 29 # Pingが成功したIPに対し、arp -aを実行 30 if ping_result != -1: 31 arp_res = subprocess.run(['arp', '-a', target_ip], stdout=subprocess.PIPE) 32 arp_result = arp_res.stdout.decode('cp932') 33 # print(arp_result) 34 35 # arp -aでMACアドレスが取得できたか判定し、MACアドレスが取得できたものは、テキストファイルにarp-aの結果を出力 36 if re.match('ARP', arp_result) is None: 37 print('OK', arp_result) 38 # with open('arp.txt', 'w', encoding='shift-jis') as f: 39 # writer = f.writelines(arp_result) 40 41 # with open('arp.txt', 'r', encoding='shift-jis') as f: 42 # elems = f.readlines() 43 44 # 以下、IPとMACアドレスを抽出する処理 45 elems = arp_result.split('n') 46 elem = elems[6].split('n') # ここでエラーが発生してしまう。 47 48 ip_address = elem[2] 49 mac_address = elem[13] 50 51 # MACアドレスが取得できなかった場合、mac_address変数に、N/Aを代入 52 else: 53 ip_address = target_ip 54 mac_address = 'N/A' 55 56 # ホスト名を取得 57 fqdn_res = socket.getfqdn(ip_address) 58 if fqdn_res != ip_address: 59 fqdn = fqdn_res 60 else: 61 fqdn = 'N/A' 62 63 # 取得した、IP、mac、ホスト名を、それぞれのリストへ格納 64 ip.append(ip_address) 65 mac.append(mac_address) 66 host.append(fqdn) 67 print(ip_address, mac_address, fqdn) 68 69 else: 70 print(f'{target_ip} - Ping NGです。') 71 # print(fqdn_result) 72 73 # 取得した、IP、mac、ホスト名をCSVに書き出す 74 to_csv(ip, mac, host) 75 76 77def to_csv(ip_arge, mac_arge, host_arge): 78 df = pd.DataFrame([ip_arge, mac_arge, host_arge]) 79 print(df.T) 80 df.T.to_csv('sample.csv', header=False, index=False, encoding='shift-jis') 81 82 83ip_res = ip_genarate() 84 85reserch(ip_res) 86

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

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

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

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

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

javahack

2021/11/09 00:11

elems = arp_result.split('n') の後にelemsの内容を出力して配列の要素数が想定通り7以上あるか確認してみてはいかがでしょうか。
melian

2021/11/09 00:15

もしかして newline("\n") で分割するつもりなのではないですか?
quickquip

2021/11/09 03:04

このコードを何をするつもりで書いたのか(elems[6] の 6はなぜ6なのですか?)を、質問に載せた方がいいです。
guest

回答1

0

list index out of range

リストの範囲を超えてアクセスしようとした、というエラーです
なので、
まずは、elemsになにが入ってるのかってのを調べてみてはどうでしょう

投稿2021/11/09 00:48

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問