dnjiro’s 9VAe blog

誰でもアニメが作れる無料ソフト9VAeきゅうべえ開発者のブログ

Python パイソンで エクセル表からファイルを作る方法

Python パイソンで エクセル表からファイルを作る方法を解説しました。Pythonで アニメを作る方法はこちらPythonの使い方はこちら

ほかの解説動画はこちら

目次

Python (パイソン) の入手

Windows の場合

ラズベリーパイの場合

Mac の場合

  • M1版 Macの場合、Python.jpのフルインストーラ版から、ダウンロードするのが簡単。ここ(pythonlinks.python.jp) からダウンロードできます。
  • IntelMac では、python (Ver2), python3(Ver3) が最初からはいっており、ターミナルから使えました。
  • ターミナルは「アプリケーション>ユーティリティ」の中にはいっています。ドックの上にターミナルアイコンをドラッグして登録しておくとよいでしょう。

python2 と python3 の違い

  • python2 と python3 で書き方が違うところがあるので注意(ネット上には、python2のプログラムもあり、そのまま python3で動かすとエラーになります)
  • プログラムに日本語を入れたいとき(表示したい文字が日本語など)は、python3 を使います。

 

Python (IDLE) の起動

Pythonを使ってみましょう。基本的な IDLE を使ってみます。

Windows の場合

  1. Windowsボタンをクリックし「python」と入力して、アプリ IDLE(Python) を実行。
  2. ターミナルから「idle」を実行してもかまいません。Python という名前で IDLE が起動します。

ラズベリーパイの場合

  1. 画面左上の Raspi ボタン>Programming(プログラミング) > Python の Shell ウィンドウ(実行画面)が開きます。

 

IDLE(Python)の操作

  1. Fileメニューから、New File を実行。エディタがひらきます
  2. ここに下のようなプログラムを入れます 
  3. Run メニューから、Run Module を実行
  4. Pythonウィンドウで実行されます。エラーがあれば、ここに表示されます

Python のプログラム 例1

下のような Python プログラムをいれてみましょう。

  1. エクセルから出力した CSVファイルを開く
  2. CSVファイルの各行を読み込んで、1行ずつ出力
  3. 終了を表示して入力待ちする

プログラム例を示します。

import os         # ファイル操作
srcCSV = "c:/test/test.csv"    # CSVファイル
fr = open(srcCSV,'r')
for ln in fr:
    print(ln)
fr.close()
a = input("***end*** ")
  • import os は、ファイル処理するときに必要です
  • srcCSV は、CSVファイルのフルパス。パスの区切りは「/」です
  • open がファイルを開く関数。'r' は読み出しの意味。
  • for ln in fr: は、ファイルを1行ずつ読み出して、ln にいれるの意味
  • print() でなかの変数を表示
  • Input() 文字入力関数で、"***end*** " を表示して入力待ちになります

UnicodeDecodeError: 'cp932' codec can't decode エラー

上のプログラムを実行すると、上のエラーが出ました。

cp932 は、Shift-JISのことです。open に 「encoding="utf-8"」をいれるとエラーが出なくなりました

fr = open(srcCSV,'r',encoding="utf-8")
  • Python のプログラムは、文字コード utf-8 で書かないといけないのですが、ファイル open の文字コードが、何も書かないと、Shift-JIS になるようです。初期のころ、WindowsMac も日本語の標準が Shift-JISだったなごりでしょう

 

Python のプログラム 例2

プログラムを改造していきましょう。

  1. エクセル行の最初の値が「Folder」の場合、その後ろにある文字列をとりだして、その名前のフォルダを作成する
  2. ルートフォルダの場所は、先頭で指定

下のようなCSVファイルを想定しています。

Folder,aaa,bbb,ccc
Data1,100,101,102
Data2,200,201,202

プログラム例を示します。

import os         # ファイル操作
import csv        # CSV処理
srcCSV = "c:/test/test.csv"    # CSVファイル(各自の環境に合わせて修正)
outDIR = "c:/test/"    # 出力先フォルダ(各自の環境に合わせて修正) fr = open(srcCSV,'r') cr = csv.reader(fr) for ln in cr: if ln[0] == "Folder": for nm in ln[1:]: dir = outDIR+"/"+nm if not os.path.exists(dir): os.mkdir(dir) print(ln) fr.close() a = input("***end*** ")
  • import csv で、csv.reader が使えるようになります
  • for ln in cr: の ln は、リスト(文字列の配列)になります
  • ln[0] は最初の文字列(先頭は0)
  • for nm in ln[1:] の ln[1:] はリストの2番目から最後まで。nmは名前になります
  • os.path.exists(dir) がファイル・フォルダの存在チェック
  • os.mkdir(dir) でフォルダ作成

Runメニュー>Run Module で実行します。エラーがなければ aaa,bbb,cccフォルダが作成されるはずです。

Python のプログラム 例3

さらに、プログラムを次のように改造しましょう。

  1. 作成した各フォルダの中に、テキストファイルを作成し、値をいれる
  2. テキストファイル名は、先頭列の名前にする

下のようなCSVファイルを想定しています。

Folder,aaa,bbb,ccc
Data1,100,101,102
Data2,200,201,202

プログラム例を示します。

import os         # ファイル操作
import csv        # CSV処理
srcCSV = "c:/test/test.csv"    # CSVファイル(各自の環境に合わせて修正)
outDIR = "c:/test/"    # 出力先フォルダ(各自の環境に合わせて修正) dirs = "" fr = open(srcCSV,'r') cr = csv.reader(fr) # csv読み出し for ln in cr: # 1行リスト if ln[0] == "Folder": dirs = ln # フォルダ名を記憶 for nm in ln[1:]: dir = outDIR+"/"+nm if not os.path.exists(dir): os.mkdir(dir) print(nm) continue # Folder行終了 for id,nm in enumerate(ln): #番号id と中身nm を取り出す if id > 0: txt = outDIR+"/"+dirs[id]+"/"+ln[0]+".txt" if os.path.exists(txt): os.remove(txt) # 存在していたファイルを削除 fw = open(txt,'x') # 'x'新規 'w'既存ファイルに書き込み 'a'追記 fw.write(nm) # 項目をテキストに書き込みます fw.close() # 書き込み終了 fr.close() a = input("***end*** ")

Runメニュー>Run Module で実行します。エラーがなければ 下のようなフォルダとファイルが作成されるはずです。

test
  ├──aaa
  │    ├──Data1.txt    
  │    └──Data2.txt    
  ├──bbb
  │    ├──Data1.txt    
  │    └──Data2.txt    
  ├──ccc
  │    ├──Data1.txt    
  │    └──Data2.txt

改行コードを指定する方法

上のプログラムを Windowsで実行すると、改行コードが、CR,LF になります。

  1. open の引数に "b"をつける。これで書き出しがバイナリーモードになります
  2. 文字列の出力のうしろに、.encoding() をつけます。
  3. LFは、文字列「"\n"」、CRは、文字列「"\r"」を出力します

上のプログラムの修正箇所

      lf="\n" #改行(LF)
      fw = open(txt,'xb')  # 'b'バイナリー
      fw.write(nm.encode())
      fw.write(lf.encode())

 

さらに勉強をすすめたいなら

9VAeきゅうべえに関する問い合わせ