80732


初めて質問させていただきます。  
pythonで「netsh wlan show interface」の出力結果を  
下記条件でCSVへ変換したいのですが、まったくもってできない状態です。  
どなたか、ご教示願います。

条件  
①システムに 1 インターフェイスがあります: を削除  
② ホストされたネットワークの状態: 利用不可 を削除  
③名前からプロファイル名までをCSV形式へ変換し、sample.csvとして保存

[code]

    システムに 1 インターフェイスがあります:
    
        名前                   : Wi-Fi
        説明                   : Qualcomm Atheros QCA61x4A Wireless Network Adapter
        GUID                   : 000000000000000000
        物理アドレス           : xx:xx:xx:xx:xx:xx
        状態                   : 接続されました
        BSSID                  : xx:xx:xx:xx:xx:xx
        ネットワークの種類     : インフラストラクチャ
        無線の種類             : 802.11n
        認証                   : WPA2-パーソナル
        暗号                   : CCMP
        接続モード             : 自動接続
        チャネル               : 6
        受信速度 (Mbps)        : 144.4
        送信速度 (Mbps)        : 144.4
        シグナル               : 94%
        プロファイル           : sample-wifi
    
        ホストされたネットワークの状態: 利用不可
    
[/code]

まず、条件①を満たすために"システムに 1 インターフェイスがあります:"をreplaceで空白へ  
置換（削除）を行おうとしましたが、うまくいきません。。。

色々、調べているのですが、時間がなく切羽詰まっている状況です。

[code]

    del_word_1 = 'システムに 1 インターフェイスがあります:'
    with open('tmp.txt', 'r') as f:
    
        for line in f:
            line = f.readline().rstrip('\r\n')
            if 'システムに 1 インターフェイスがあります:' == del_word_1:
                line.replace("システムに 1 インターフェイスがあります:", "").strip()
                print(line)
    
[/code]


CC BY-SA 4.0
2021-08-11T14:11:12.510
80728
2021-08-13T12:19:00.653
2021-08-13T09:31:51.937
4236
question
python
python CSV出力（に使用するデータの読み込み）について


Python を使う必要性がないのであれば、PowerShell を使ってみてはどうでしょうか。

[code]

    netsh wlan show interface |
    Select-String -Pattern "^\s+" |
    Select -SkipLast 1 |
    ForEach-Object {
      ($_ -split ":", 2 | ForEach-Object { $_.trim() }) -join ","
    } > .\sample.csv
    
[/code]

**sample.csv**

[code]

    名前,Wi-Fi
    説明,Qualcomm Atheros QCA61x4A Wireless Network Adapter
    GUID,000000000000000000
    物理アドレス,xx:xx:xx:xx:xx:xx
    状態,接続されました
    BSSID,xx:xx:xx:xx:xx:xx
    ネットワークの種類,インフラストラクチャ
    無線の種類,802.11n
    認証,WPA2-パーソナル
    暗号,CCMP
    接続モード,自動接続
    チャネル,6
    受信速度 (Mbps),144.4
    送信速度 (Mbps),144.4
    シグナル,94%
    プロファイル,sample-wifi
    
[/code]


CC BY-SA 4.0
2021-08-11T16:14:57.327
80729
2021-08-11T16:14:57.327
47127
80728
answer


まずはファイルの内容をそのまま読み込んで出力することからやってみてはどうでしょうか？  
openしたあとのfをfor inでループ処理すれば、readlineする必要はないのでこんな感じです。

[code]

    with open('tmp.txt', 'r') as f:
    for line in f:
        line = line.rstrip('\r\n')
        print(line)
    
[/code]

これで、1行ずつ読んだ行がそのまま出力されます。

次に、①の「システムに～」は削除するところですが、これは読みこんだ行を無視すれば最終的な出力からは削除されることになりますよね。

[code]

    with open('tmp.txt', 'r') as f:
    for line in f:
        line = line.rstrip('\r\n')
        if 'システムに 1 インターフェイスがあります:' in line:
            continue
        print(line)
    
[/code]

lineに「システムに 1
インターフェイスがあります:」という文字列が含まれていたら次の行へやり直してます。その行は出力されません。同じようにすれば②も読み飛ばせますよね。

最後にCSV出力のところですが、最終的な求める出力結果が質問からは分からないので想像ですが、こういう結果が求められているとして、

[code]

    名前,説明,GUID,......
    Wi-Fi,Qualcomm Atheros QCA61x4A Wireless Network Adapter,000000000000000000,....
    
[/code]

これはもとのファイルと行と列が入れ替わっているので1行ずつ読みながら処理することはできません。全部読み込んでから最後に出力します。

ここまでヒントを出したのであとは、もう少し分からないところを整理してみて質問してみたら良いと思います。

「CSVをどうやって作るのか」「どうやって項目を切り出すのか」「ファイルにどうやって保存するのか」などいろんなつまづきポイントがあるなかで質問者さんがどこまでできて、どこが分からないのかを整理して質問してみてください。


CC BY-SA 4.0
2021-08-11T16:28:53.313
80730
2021-08-11T16:28:53.313
28626
80728
answer


@sayuri さんのコメントのように、「書き出し」ではなく「読み取ってCSVに変換」するところでつまづいていますね。

色々と突っ込みどころがありますが、まず`for line in f:`のループの中に`line =
f.readline().rstrip('\r\n')`が存在するのがおかしい所です。

Pythonに限らずプログラム上の制御と変数の考え方とかテキストデータの構成とかの理解が不足している感じです。

まずテキストデータの構成を考えてみましょう。  
ちょっとやっつけ作業で応用の利かせにくい方法ですが、以下のように考えられます。

  * ①と②の処理を工夫しなくても、まず改行コードの連続`split('\n\n')`で区切ってリストにすれば、2つ目の文字列が取り出したいデータになるので、それをさらに1つの改行コードで区切れば`split('\n')`行毎のリストになる
  * この際、インターフェイスは1つの場合だけに限定する(`システムに 2 インターフェイスがあります:`とかは考えない)
  * 取り出したデータを更に処理する際に、物理アドレスやBSSIDの中にも`:`があるので、項目名とデータの区切りは前後に空白を含んだ`split(' : ')`とする
  * 項目名の前後の空白は削除しておく
  * 他に例えば使っていないインターフェイスといった場合に以下のようにデータが2行になる場合があるが、こうしたデータは対象外とする

[code]

        無線の状態             : ハードウェア オン
                                 ソフトウェア オン
    
[/code]

* * *

上記を元に、Pythonだとこんな感じのプログラムで出来るでしょう。  
「読み取ってCSV(というか2次元のリスト)に変換」の部分はリスト内包表記の入れ子で行っています。

[code]

    with open('tmp.txt','r') as f:
        data = [[y.strip() for y in x.split(' : ')] for x in f.read().split('\n\n')[1].split('\n')]
    
    import csv
    
    with open('sample.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(data)
    
[/code]

* * *

ちなみに @civi さん回答の出力するCSVの形式に対する考慮はもっともなので、こんな記事の応用で出来るでしょう。  
項目名とデータは両方とも揃っている前提で考えてます。  
[列の抽出 - Python3 – リストの要素・行・列の抽出](http://taustation.com/python3-list-elements-
extraction/#i-6)

[code]

    newdata = []
    newdata.append([x[0] for x in data])
    newdata.append([x[1] for x in data])
    
    ### 上記をファイルに書き込む時は newdata を使って writer.writerows(newdata) とする
    
[/code]


CC BY-SA 4.0
2021-08-11T16:33:00.987
80731
2021-08-11T17:20:38.340
2021-08-11T17:20:38.340
26370
26370
80728
answer


pandas のデータフレームに変換する方法も考えられます。また、property と value を列ではなく行単位で構成するので
`pandas.DataFrame.T`(transpose) を使います。

[code]

    import pandas as pd
    from datetime import datetime
    
    # to dataframe(transpose row and column)
    df = (
      pd.read_table('tmp.txt', encoding='cp932')
        .iloc[:-1, 0]
        .str.extract(r'^\s+(.+?)\s*:\s*(.+?)\s*$')
        .T
    )
    
    # insert current time
    df.insert(0, 'now', ('日時', datetime.now().strftime("%Y/%m/%d %H:%M:%S")))
    
    # save with csv format
    df.to_csv('sample.csv', index=False, header=None, encoding='cp932')
    # df.iloc[1:,:].to_csv('sample.csv', mode='a', index=False, header=None, encoding='cp932')
    
[/code]

**property-value table**  
`df.to_markdown(index=False))`

日時 | 名前 | 説明 | GUID | 物理アドレス | 状態 | BSSID | ネットワークの種類 | 無線の種類 | 認証 | 暗号 |
接続モード | チャネル | 受信速度 (Mbps) | 送信速度 (Mbps) | シグナル | プロファイル  
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---  
2021/08/12 13:47:49 | Wi-Fi | Qualcomm Atheros QCA61x4A Wireless Network
Adapter | 000000000000000000 | xx:xx:xx:xx:xx:xx | 接続されました | xx:xx:xx:xx:xx:xx
| インフラストラクチャ | 802.11n | WPA2-パーソナル | CCMP | 自動接続 | 6 | 144.4 | 144.4 | 94% |
sample-wifi


CC BY-SA 4.0
2021-08-11T18:29:57.757
80732
2021-08-13T12:19:00.653
2021-08-13T12:19:00.653
47127
47127
80728
answer