min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

Excelファイル(xlsでもxlsxでも)CSVに変換 → Sheet名をファイル名.csvにする

経産省の工場立地動向調査

ここにあるxlsxの全シートをCSVに変換したい。

www.meti.go.jp

 

できた

$ python3 myXLS2CSVb.py 20241004_r05_xlsx_allfile.xlsx

できてる。

$ vim 20241004_r05_xlsx_allfile_33-1_33-2.csv

 

ソース

$ vim myXLS2CSVb.py

import sys 
import os
import subprocess
import xlrd
import pandas as pd
import re

#if len(sys.argv) != 2 or ".pdf" not in sys.argv[1].lower():
if len(sys.argv) != 2 or ".xls" not in sys.argv[1].lower():
        print(f'引数不足')
        print(f"python {sys.argv[0]} 変換対象のExcelファイル.xls")
        sys.exit()

print(f"引数: {sys.argv[1]}")
#print(sys.argv[1])

infile = sys.argv[1]
print('--------------')
print('入力ファイル名のbase')
base_name = os.path.splitext(infile)[0]  # ファイル名本体
print(base_name) 

print('--------------')
print('拡張子に基づいて適切なエンジンを選択')
file_extension = os.path.splitext(infile)[1]

if file_extension == ".xls":
    engine = 'xlrd'
elif file_extension == ".xlsx":
    engine = 'openpyxl'
else:
    print("エラー: サポートされていないファイル形式です")
    sys.exit(1)
print('--------------')
print('engineは ' + engine)

print('--------------')
print('OSのファイル名として使えない文字をアンダースコアに置換する関数')
print('禁則文字をアンダーバー化する正規表現を実現するfunction')
print('冒頭で import re必須')
def sanitize_filename(sheet_name):
    #return re.sub(r'[\\/*?:"<>|]', '_', sheet_name)
    # カンマもダメ
    return re.sub(r'[\\/*?:"<>|,]', '_', sheet_name)

print('--------------')
print('Excelファイルの読み込み')
try:
    excel_file = pd.ExcelFile(infile, engine=engine)
    print(f"ファイル '{infile}' を読み込みました")
except Exception as e:
    print(f"エラー: ファイルの読み込みに失敗しました: {e}")
    sys.exit(1)

# シートごとに処理
for i, sheet_name in enumerate(excel_file.sheet_names):
    try:
        print('--------------')
        print('シートをデータフレームとして読み込み')
        df = pd.read_excel(excel_file, sheet_name=sheet_name)
        print('--------------')
        #連番sheet名OK→  print('出力ファイル名を設定')
        #連番sheet名OK→  output_filename = f"{base_name}_sheet{i+1}.csv"
        print('シート名を使ってファイル名を生成')
        sanitized_sheet_name = sanitize_filename(sheet_name)
        output_filename = f"{base_name}_{sanitized_sheet_name}.csv"
        print(output_filename)
        print('--------------')
        print('CSVとして保存')
        df.to_csv(output_filename, index=False)
        print(f"シート '{sheet_name}' を '{output_filename}' に保存しました")
    except Exception as e:
        print(f"エラー: シート '{sheet_name}' の処理中に問題が発生しました: {e}")


#OKK print('オブジェクト作成')
#OKK #targetXLS = xlrd.open_workbook('230816s5.xls')
#OKK #OKK targetXLS = xlrd.open_workbook(infile)
#OKK 
#OKK # pandasを使って .xlsx ファイルを読み込む
#OKK try:
#OKK     #df = pd.read_excel(infile, engine='openpyxl')
#OKK     targetXLS = pd.read_excel(infile, engine='openpyxl')
#OKK     print("ファイル読み込み成功")
#OKK     #print(df.head())  # 確認のために最初の数行を表示
#OKK     print(targetXLS.head(10))  # 確認のために最初の数行を表示
#OKK except Exception as e:
#OKK     print(f"エラー: {e}")

#OKK print('--------------')
#OKK print('出力ファイル名')
#OKK #outCSV = '230816s5.csv'
#OKK outCSV = base_name + '.csv'
#OKK print(outCSV)


#xlrd_OK print('-----------------------------')
#xlrd_OK print('シート名取得 imoprt xlrd 必要') 
#xlrd_OK print(targetXLS.sheet_names())
#xlrd_OK #['ハイオク', 'レギュラー', '軽油', '灯油店頭', '灯油配達']
#xlrd_OK 
#xlrd_OK print('-----------------------------')
#xlrd_OK print('pandasでCSVに変換')
#xlrd_OK #mysheet = 'レギュラー'
#xlrd_OK #ff = pd.read_excel(targetXLS)
#xlrd_OK # 改良前20230909
#xlrd_OK #ff = pd.read_excel(targetXLS, sheet_name='レギュラー')
#xlrd_OK try:
#xlrd_OK     ff = pd.read_excel(targetXLS, sheet_name='AJ10')
#xlrd_OK #except pd.errors.ParserError:
#xlrd_OK except ValueError:
#xlrd_OK     ff = pd.read_excel(targetXLS, sheet_name='Sheet1')
#xlrd_OK 
#xlrd_OK ff.to_csv(outCSV, index=None, header=True)
#xlrd_OK 
#xlrd_OK print('-----------------------------')
#xlrd_OK print(outCSV + 'に保存完了')
#xlrd_OK 
#xlrd_OK print('-----------------------------')
#xlrd_OK try:
#xlrd_OK     cat_p = subprocess.Popen(["cat", outCSV], stdout=subprocess.PIPE)
#xlrd_OK     head_p = subprocess.Popen(["head", "-n", "3"], stdin=cat_p.stdout, stdout=subprocess.PIPE)
#xlrd_OK     tail_p = subprocess.Popen(["tail", "-n", "3"], stdin=cat_p.stdout)
#xlrd_OK     cat_p.stdout.close()  # catの標準出力を閉じる
#xlrd_OK 
#xlrd_OK     head_p_output = head_p.communicate()[0]
#xlrd_OK     tail_p_output = tail_p.communicate()[0]
#xlrd_OK     print('----------')
#xlrd_OK     print("Head -n 3:")
#xlrd_OK     print(head_p_output.decode("utf-8"))
#xlrd_OK     print('----------')
#xlrd_OK     print("Tail -n 3:")
#xlrd_OK     #print(tail_p_output.decode("utf-8"))
#xlrd_OK     print(tail_p_output)
#xlrd_OK 
#xlrd_OK except subprocess.CalledProcessError as e:
#xlrd_OK     print(f"Error: {e}")
#xlrd_OK 
#xlrd_OK 
#xlrd_OK 
#xlrd_OK # try:
#xlrd_OK #     cat_process = subprocess.Popen(["cat", outCSV], stdout=subprocess.PIPE)
#xlrd_OK #     tail_process = subprocess.Popen(["tail", "-n", "3"], stdin=cat_process.stdout)
#xlrd_OK #     cat_process.stdout.close()  # catの標準出力を閉じる
#xlrd_OK # 
#xlrd_OK #     tail_process.wait()  # tailコマンドの完了を待つ
#xlrd_OK # except subprocess.CalledProcessError as e:
#xlrd_OK #     print(f"Error: {e}")
#xlrd_OK 
#xlrd_OK 
#xlrd_OK # try:
#xlrd_OK #     subprocess.run(["cat", outCSV], check=True)
#xlrd_OK # except subprocess.CalledProcessError as e:
#xlrd_OK #     print(f"Error: {e}")

 



 

1,000万円を超えたbitcoinを少しだけどもらえるURL

https://bitflyer.com/invitation?id=l50e5ljw&lang=ja-JP

ハピタスからポイントもらえるURL

その買うを、もっとハッピーに。|ハピタス