経産省の工場立地動向調査
ここにあるxlsxの全シートをCSVに変換したい。
できた
$ 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