Sahara3のAI副業

AI副業でどこまでいけるのか?

AI副業:OSバージョン・ビルドの対比表バージョンアップ

「さはら3」です。

AI副業でどこまでいけるのか?をテーマに頑張っていきたいと思います。



頭の体操

  • 1か所だけ異なる漢字が入っています。(解答は一番最後に掲載)

問題


本編

以前の記事(AI副業:WindowsのビルドバージョンとKBの対比表をPythonで作りたい。 - Sahara3のAI副業)で作成した対比表ですが

どうせなら、Windowsバージョンとの対比表にマージしてしまおうと思い立ちバージョンアップしました。


最新対比表(2023年8月以降分のみ)

Availability date Version Build KB article
2023/10/10 Windows 11 22H2 22621.2428 KB5031354
2023/10/10 Windows 11 21H2 22000.2538 KB5031358
2023/10/10 Windows 10 22H2 19045.357 KB5031356
2023/10/10 Windows 10 21H2 19044.357 KB5031356
2023/10/10 Windows 10 1809 17763.4974 KB5031361
2023/10/10 Windows 10 1607 14393.6351 KB5031362
2023/10/10 Windows 10 1507 10240.20232 KB5031377
2023/9/26 Windows 11 22H2 22621.2361 KB5030310
2023/9/26 Windows 11 21H2 22000.2482 KB5030301
2023/9/26 Windows 10 22H2 19045.3516 KB5030300
2023/9/12 Windows 11 22H2 22621.2283 KB5030219
2023/9/12 Windows 11 21H2 22000.2416 KB5030217
2023/9/12 Windows 10 22H2 19045.3448 KB5030211
2023/9/12 Windows 10 21H2 19044.3448 KB5030211
2023/9/12 Windows 10 1809 17763.4851 KB5030214
2023/9/12 Windows 10 1607 14393.6252 KB5030213
2023/9/12 Windows 10 1507 10240.20162 KB5030220
2023/8/22 Windows 11 22H2 22621.2215 KB5029351
2023/8/22 Windows 11 21H2 22000.236 KB5029332
2023/8/22 Windows 10 22H2 19045.3393 KB5029331
2023/8/8 Windows 11 22H2 22621.2134 KB5029263
2023/8/8 Windows 11 21H2 22000.2295 KB5029253
2023/8/8 Windows 10 22H2 19045.3324 KB5029244
2023/8/8 Windows 10 21H2 19044.3324 KB5029244
2023/8/8 Windows 10 1809 17763.4737 KB5029247
2023/8/8 Windows 10 1607 14393.6167 KB5029242
2023/8/8 Windows 10 1507 10240.20107 KB5029259

スクリプト

import requests
from bs4 import BeautifulSoup
import csv
import os
import pandas as pd
import re

def get_web_data(URL):
    response = requests.get(URL)
    web_source = response.text
    

    # Clean up the web source
    web_source = web_source.replace("\n", "").replace("\r", "")

    for _ in range(100):
        web_source = web_source.replace("> ", ">").replace(">\t", ">").replace(" <", "<").replace("\t<", "<").replace("\t", "")
    web_source = web_source.replace("><", ">\r\n<")

    with open(r"c:\temp\OS_Build_temp.csv", "w", encoding="utf-8") as f:
        writer = csv.writer(f, delimiter="\t")
        writer.writerow(["Servicing option", "Availability date", "Build", "KB article"])
    
    soup = BeautifulSoup(web_source, "html.parser")

    for i in range(100):
        table = soup.find("table", {"id": f"historyTable_{i}"})
        if table:
            rows = table.find_all("tr")
            for row in rows:
                cols = row.find_all(["td", "th"])
                cols = [ele.text.strip() for ele in cols]
                with open(r"c:\temp\OS_Build_temp.csv", "a", encoding="utf-8") as f:
                    writer = csv.writer(f, delimiter="\t")
                    writer.writerow(cols)

    os_build_versions = []
    for line in web_source.split("\r\n"):
        if re.search(r"OS\s*Build", line, re.IGNORECASE):
            os_build_version = BeautifulSoup(line, "html.parser").get_text()
            os_build_version = os_build_version.replace("- End of servicing", "").replace("Version ", "").replace("(RTM) ", "").replace(" ", "")
            
            # "OS build"の後の数字を取得
            build_number = os_build_version.split("(OSbuild")[1].split(")")[0]
            
            # 数字が1で始まる場合はWindows 10、2で始まる場合はWindows 11と判断
            if build_number.startswith("1"):
                os_build_version = "Windows 10 " + os_build_version
            elif build_number.startswith("2"):
                os_build_version = "Windows 11 " + os_build_version
            
            formatted_version = os_build_version.replace("(OSbuild", "\t").replace(")", "")
            os_build_versions.append(formatted_version.split("\t"))

            # os_build_versionを画面に表示
            # print(formatted_version)

    with open(r"C:\temp\OS_Build_Version_temp.csv", "a", encoding="utf-8") as f:
        writer = csv.writer(f, delimiter="\t")
        writer.writerows(os_build_versions)

 
    rep_os_build_versions = []
    for version in os_build_versions:
        if len(version) > 1:  # versionが2つ以上の要素を持つ場合のみ処理を進める
            os_ver = "Windows 10 " + version[0]  # Assuming WinName is "Windows 10"
            rep_os_build_versions.append([os_ver, version[1]])

    with open(r"C:\temp\OS_Build_Version.csv", "a", encoding="utf-8") as f:
        writer = csv.writer(f, delimiter="\t")
        writer.writerow(["Version", "Build"])
        writer.writerows(rep_os_build_versions)

    # この関数の最後で、データフレームを返すように変更
    df = pd.read_csv(r"c:\temp\OS_Build_temp.csv", delimiter="\t", encoding="utf-8")
    return df


def remove_duplicates_and_save(dataframes):
    # 2つのデータフレームを結合
    combined_df = pd.concat(dataframes, ignore_index=True)

    # 重複を排除
    combined_df = combined_df.drop_duplicates()

    # 指定されたカラムだけを持つデータフレームを作成
    combined_df = combined_df[["Availability date", "Build", "KB article"]]

    # 'Availability date' で降順にソート
    combined_df = combined_df.sort_values(by=["Availability date", "Build"], ascending=[False, False])

    # "Availability date" が "Availability date" である行を削除
    combined_df = combined_df[combined_df["Availability date"] != "Availability date"]

    # CSVファイルとして保存
    combined_df.to_csv(r"c:\temp\OS_Build.csv", index=False, encoding="utf-8", header=True)

def delete_files(file_paths):
  """
  指定されたファイルパスのファイルを削除します。

  Args:
    file_paths: 削除するファイルパスのリスト。
  """
  for file_path in file_paths:
    os.remove(file_path)

def sort_and_save_csv():
    # ファイルを読み込む
    df = pd.read_csv(r"C:\temp\OS_Build_Version_temp.csv", delimiter="\t", encoding="utf-8")
    
    # 'Build'で降順にソート
    df = df.sort_values(by="Build", ascending=False)
    
    # CSVファイルとして保存
    df.to_csv(r"C:\temp\OS_Build_Version_temp.csv", index=False, encoding="utf-8", header=True)

def merge_csv_files():
    # CSVファイルを読み込む
    df_os_build = pd.read_csv(r"C:\temp\OS_Build.csv", encoding="utf-8")
    
    # カラムを','で分割
    df_os_build_version_temp = pd.read_csv(r"C:\temp\OS_Build_Version_temp.csv", delimiter=",", encoding="utf-8")

    # Buildカラムの'.'の前の部分だけを取得して新しいカラムとして追加
    df_os_build['Build_key'] = df_os_build['Build'].astype(str).str.split(".").str[0]
    df_os_build_version_temp['Build_key'] = df_os_build_version_temp['Build'].astype(str).str.split(".").str[0]

    # 両方のデータフレームを'Build_key'カラムでマージする
    merged_df = pd.merge(df_os_build, df_os_build_version_temp, on='Build_key', how='left')

    # 'Version'カラムがNaNの場合、その行を削除する
    merged_df = merged_df.dropna(subset=['Version'])

    # 不要な'Build_key'カラムを削除
    merged_df.drop(columns=['Build_key'], inplace=True)

    # マージしたデータフレームをCSVファイルとして保存
    merged_df.to_csv(r"C:\temp\OS_Build_Merged.csv", index=False, encoding="utf-8")

def reorder_and_save_csv():
    # CSVファイルを読み込む
    df = pd.read_csv(r"C:\temp\OS_Build_Merged.csv", encoding="utf-8")

    # カラムの順番を指定された順番に並べ替え
    df = df[['Availability date', 'Version', 'Build_x', 'KB article']]

    # 'Build_x'のカラム名を'Build'に変更
    df.rename(columns={'Build_x': 'Build'}, inplace=True)

    # CSVファイルとして保存
    df.to_csv(r"C:\temp\OS_Build_Merged.csv", index=False, encoding="utf-8")



if __name__ == "__main__":
    # ファイルをクリア
    with open(r"C:\temp\OS_Build_Version_temp.csv", "w", encoding="utf-8") as f:
        writer = csv.writer(f, delimiter="\t")
        writer.writerow(["Version", "Build"])

    dataframes = []

    URL = 'https://learn.microsoft.com/en-us/windows/release-health/release-information'
    dataframes.append(get_web_data(URL))

    URL = 'https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information'
    dataframes.append(get_web_data(URL))

    # 2つのデータフレームを合算して処理
    remove_duplicates_and_save(dataframes)
    
    # CSVファイルをソートして保存
    sort_and_save_csv()

    # 関数を呼び出してCSVファイルをマージする
    merge_csv_files()

    # 関数を呼び出してCSVファイルのカラムを並べ替える
    reorder_and_save_csv()

    file_paths = [r"C:\temp\OS_Build_temp.csv", r"C:\temp\OS_Build_Version.csv"]
    delete_files(file_paths)

解説

  • 前回作成した以下の表のBuildの一部
Availability date Build KB article
2023-10-10 22621.2428 KB5031354
2023-10-10 22000.2538 KB5031358
2023-10-10 19045.3570 KB5031356
2023-10-10 19044.3570 KB5031356
2023-10-10 17763.4974 KB5031361
2023-10-10 14393.6351 KB5031362
2023-10-10 10240.20232 KB5031377

  • 今回新たに抽出した以下の表のBuildの情報
Version Build
Windows 11 22H2 22621
Windows 11 21H2 22000
Windows 10 22H2 19045
Windows 10 21H2 19044
Windows 10 21H1 19043
Windows 10 1809 17763
Windows 10 1607 14393
Windows 10 1507 10240

  • 上記2つの情報をマッチングさせて、最終的に以下の表を作成しました。
Availability date Version Build KB article
2023/10/10 Windows 11 22H2 22621.2428 KB5031354
2023/10/10 Windows 11 21H2 22000.2538 KB5031358
2023/10/10 Windows 10 22H2 19045.357 KB5031356
2023/10/10 Windows 10 21H2 19044.357 KB5031356
2023/10/10 Windows 10 1809 17763.4974 KB5031361
2023/10/10 Windows 10 1607 14393.6351 KB5031362
2023/10/10 Windows 10 1507 10240.20232 KB5031377

まとめ

Windowsのバージョンと、ビルド番号、KB Articleの対比表が出来上がりました。

一般の方は、あまり認識がないかと思いますが、企業にお勤めの方にとって

多少は役に立ったでしょうか?

  • この記事にすべての対比表を記載してしまうと、長くなってしまうので、別ページを作成予定です。(少々お待ちください。)

AI関連は日進月歩、日々之精進でございます。

最後まで読んで頂きありがとうございました。

AIさはら


頭の体操:解答

  • みつかりましたか?

解答


本日のAI着物美女

AI着物美女

Instagram

良かったらInstagramのフォローをお願いします。

https://www.instagram.com/ai_kimono_bijo/

非アダルトで運営しておりますので、職場でも安心して堪能いただけます。