目次
1.Pandas処理
処理内容
- 指定したエクセルやデータファイルを開く
- 別のデータファイルを開く(ちょっと凝ったエクセルの場合=DB思考のないエクセルの表)
- 2つのデータをマージする処理
- フィールド名取得し、データにつける
- フィールド名のリネイム(マージのときの設定で不要ではある)
- 四則演算し新たな列を追加&時間の足し算引き算
- 消し去りたい行を消し去る方法&重複データの削除方法&インデックスの振り直し
- X軸Y軸指定で値を書き換える方法
- マージしたデータを出力します
- ピボットして出力します
- 定例エクセルファイルの結合(月次や日次などのデータを一つにまとめます。)
# まずはライブラリインポート
import pandas as pd from glob
import glob
# #####処理1#######
file1 = glob('xxxxx.xlsx')
# '.xlsx'だと全部引く。フォルダに入っていると面倒なのでとりあえず指定で。
df = pd.read_excel(file1[0])
# リストで返すのでインデックスの指定が必要 for分を使うのであれば for i in file1 とすればOK
df= df.iloc[:,[0,1,2,3,5,6,7,8,9,10]]
# ilocはデータのみ抽出するのに便利!いらぬ列や行を省いたりすることができるので重宝します!
# #####処理2#######
# ↓バックスラッシュがエスケープシーケンスに引っかかるのでパスの前は「r'c\・・・・'」とする。
_df = pd.read_excel(r'C:\Users\alplab\Desktop\xxxxxx.xlsx','一覧シート')
# シート名[]でくくると返しが辞書型になる
# テキストデータを開くとき
file = glob('データ.txt')
df2 = pd.read_table(file[0],sep='\t', encoding="cp932")
# shift_jisだとはしご高を含む文字を返せない sepはタブで区切ったデータであれば設定
# CSVデータを開くとき
file = glob('データ.csv')
df2 = pd.read_csv(file[0], encoding="cp932"))
# #####処理3#######
columns=_df.iloc[4,[2,3,4,5,6]]
# ↑この処理は4行目の情報が各列のフィールド名なのでその行の情報を取得しています。
synum_cd_master=_df.iloc[5:100,[2,3,4,5,6]]
# ↑この処理は5行目以降100行目までがデータ行なので行指定をし、列はフィールド名の内容と合わせています。
synum_cd_master.columns=columns
# ガッチャンコ
synum_cd_master=synum_cd_master.rename(columns={'ID': 'NO'})
# merge用に。mergeの引数右を追加すれば不用ではある。left_on="ID", right_on="NO" など
# print(synum_cd_master.head()) #様子を確認したいとき用
# 必殺マージ
df=pd.merge(df,synum_cd_master,how='left')
# LEFT・・・左側は全部 RIGHT・・・右側を全部 inner・・一致するものが出る outer・・・全部でる。
# 重複しているものがあるとなんと2行作る
# #####処理4#######
df['なにかの数字']= df['食費'] +df['光熱費']+df['遊興費']
# ここの計算式内で使う日本語は存在するフィールド名で。左の日本語は新たに作る列名。
df['なにかの数字']= round(df['値段']/2,0) # 半額の四捨五入
# 時間形式の値を10進に変換し足し算に使う方法
zj=df2['時間.1'].str.split(':', expand =True) # 時間形式のデータの場合カンマでスプリットする
df2['h']=zj[0] # 時
df2['m']=zj[1] # 分
df2['時間_10進']=df2['h'].astype(float)+df2['m'].astype(float).div(60)
# 分を60で割った少数の数字を時間に足す
# #####処理5#######
df = df[df['ID'] != '100000'] # IDが100000でないものを残す処理です
# 重複を消したい場合
df['重複']= df.duplicated(subset=['No'],keep='last')
# keep=’ここに入るものが以下です’
#'first'にすると上から順にみて行き、最初の値以外をTrueで返します
#'last'にすると上から順にみて行き、最後の値以外をTrueで返します
#'False'とすると重複している値ずべてTrueで返します。
df = df[df['重複'] != True] # 行消しでTrueでないものを残す処理です
df = df.reset_index(drop=true,inplace=true)
# dropがTrueで元のインデックスを削除し、inpraceで上書きします。
df = df.set_index('No')
# indexをNO列で指定できます。
# #####処理6#######
df.loc[df['項目']=='りんご','価格']='130'
# 単独の要素にアクセスする場合はatとiatのほうが高速。まぁlocでもよい。。。
# #####処理7#######
df.to_excel('mergedata.xlsx',index=False)
# index行は消してます。
# #####処理8#######
pvdf=df.pivot_table(index=['商品'],values=['売上','販売数','利益''],aggfunc=sum)
pvdf.to_excel('journal_data.xlsx')
# #####処理9#######
# 月ごとや日にち毎などのエクセルファイル内のデータを結合
import pandas as pd from glob import glob
# 関数:エクセル開いて結合の巻(初回結合エラー除外付)
def date_1(i,df2,ju):
df = pd.read_excel(i,'明細シート')
df = df.iloc[2:,[2,3,4,5]]
if ju ==1:
df2=df
else:
df2=pd.concat([df2,df])
return df2
# 実行#
file = glob(r"C:\Users\alplab\Desktop\月次\*.xlsx")
df2 = pd.DataFrame()
ju=1
for i in file:
df2=date_1(i,df2,ju) # 関数呼び出し
ju=1+ju
df2.to_excel('集計.xlsx',index=False)
# 最後に出力
2.エクセル操作(openpyxl,CSV)
処理内容:エクセルの管理表で別のテキストファイルの情報を使い表を更新していく作業。
- エクセルを開き、1行目から最大行までをFor文で繰り返し、現在登録されているデータ個数をカウントします。
- もう一度エクセルを開き、最大行からマイナス1行していき1行目を残す形でデリートしていきます。(表のクリア処理)
- エクセルと更新用テキストファイルを開き、内容をエクセルの表の一番下に転記していきます。
- エクセルと更新用テキストファイルを開き、フラグの立っているものを削除する処理を行います。
#エクセルシート内の指定列におけるデータの入ったセルの行数を確認しています
def rownbchek(A):
file_path=A
book1=openpyxl.load_workbook(file_path)
sheet=book1['Sheet1']
r=book1['Sheet1'].max_row+1
rn=0
for i in range(1,r):
if sheet.cell(row=i,column=1).value !=None :
rn=1+rn
return rn
#エクセル内のすべての行を削除しています。削除は最大行から1行目だけが残るように
#マイナスカウントで削除しています。
def pt2(A,C):
file_path=A
book1=openpyxl.load_workbook(file_path)
sheet=book1['Sheet1']
r=book1['Sheet1'].max_row+1
for i in range(r,1,-1):
if i!=1:
sheet.delete_rows(i)
print('初回クリア')
book1.save(file_path)
#エクセルに削除を指示しています。テキストファイルの中にある日付がすでにエクセルにあり、
#フラグが立っているものを完了文字を代入します。
def pt3(A,D):
file_path=A
book1=openpyxl.load_workbook(file_path)
r=book1['Sheet1'].max_row
c=book1['Sheet1'].max_column+1
sheet=book1['Sheet1']
for i in range(2,r):
taisyo=sheet.cell(row=i,column=4).value
sn=sheet.cell(row=i,column=1).value
with open (D,'r')as f :
reader=csv.reader(f)
for line in reader:
niti=line[0]
asn=line[1]
nm=line[2]
torikesi=line[6]
if niti!='ヘッダー列名':
#ヘッダーの列名でない
if str(asn) + str(datetime.datetime.strptime(niti,'%Y/%m/%d')) == str(sn) + str(taisyo) :
#2つの要素が同じ値
if torikesi=='1' :
#指定列にフラグ1が立っている
if sheet.cell(row=i,column=7).value != '完':
#指定列の値が'完'という文字でない
sheet.cell(row=i,column=7,value = '完')
#完という文字を入れる
break
# For文ブレイク
for i in range(r,1,-1):
#最終行から上にみて行き「完」の文字であった場合は行ごと削除してしまう。
if sheet.cell(row=i,column=7).value =='完':
sheet.delete_rows(i)
print('取消削除')
book1.save(file_path)
#エクセルと更新用テキストを開いて一番下の行に書き込みしていきます。
def pt4(A,D,C):
with open (D,'r')as f :
reader=csv.reader(f)
fx=1
for line in reader:
niti=line[0]
asn=line[1]
nm=line[2]
zk=line[13]
if zk=='列名':
zkx=zk
else:
zk1=zk.split(':')
zkx=zk1[0]
zkct=int(zkx)*0.125
torikesi=line[6] #取消
file_path=A
book1=openpyxl.load_workbook(file_path)
r=C
c=book1['Sheet1'].max_column+1
sheet=book1['Sheet1']
if niti!='文字A':
if torikesi != '1' :
dm=random.randint(1,5)
sheet.cell(row=r+fx,column=1,value = asn)
sheet.cell(row=r+fx,column=2,value = 'データB')
sheet.cell(row=r+fx,column=3,value = 'データC')
sheet.cell(row=r+fx,column=4,value = datetime.datetime.strptime(niti,'%Y/%m/%d'))
sheet.cell(row=r+fx,column=5,value = zkct)
sheet.cell(row=r+fx,column=6,value =nm)
print('新規書き込み完了')
fx=fx+1
book1.save(file_path) #別のことする場合は.closeもお忘れなく~
#ライブラリインポートを行います。
import csv
import openpyxl
import datetime
import time
import random
#場所を書き込んでおきます。
A=r"C:\Users\alplab\Desktop\xxxx.xlsx"
D='xxxxxx.txt' #このpythonフォルダ内であればフルパスは不要
##処理1###
######クリア#############################
C=rownbchek(A) #関数から帰ってきた値をCに代入します。
##処理2###
pt2(A,C)
##処理3###
######とりあえず書き込み#############
time.sleep(2)
C=rownbchek(A)
pt4(A,D,C)
###################################
##処理4####
# ######取消を削除####################
time.sleep(2)
C=rownbchek(A)
pt3(A,D)
3.画像の処理(PIL)
処理内容:動画アニメーションファイルの作成(パラパラ漫画)
from PIL import Image
images = []
for i in range(3):
file_name ="C:\Users\alplab\Desktop\写真保管\" + str(i)+'.png'
#iの値は0からRANGEのインデックス番号 ファイル名を指定する場合はforを使わずimagesのリスト[0.png,1.pig]のように画像を追加していく。
im = Image.open(file_name)
images.append(im)
images[0].save('C:\Users\alplab\Desktop\写真保管\output.gif', save_all=True,append_images=images[1:],loop=0, duration=300)
#LOOP=0無限ループ #append_images=images[1:]はimages[0].saveでインデックス0のものを背景にしているため他の写真をその画像の上に追加する
#durationはミリ秒 100で1秒
4.PDF結合(PyPDF)
import pyPDF2
merger=Pypdf2.PdfFileMerger()
merger.append('PDFのパス1')
merger.append('PDFのパス2')
merger.append('PDFのパス3')
#append増やして行けばページ数が増えます。
merger.write('書き出し先のパスとファイル名')
merger.colse
5.iniファイルからの情報取得(configparser)
処理内容:パッケージ化する際にコード内に書いてしまうと編集が面倒なので設定ファイルとして外出しする際に利用します。
iniファイル内の構成 test.ini
----------------------------------以下より
[DEFAULT]
data_1 = ABC
data_2 = DEF
data_3 = GHI
import configparser
config_ini = configparser.ConfigParser()
config_ini.read('test.ini', encoding='utf-8')
A = config_ini['DEFAULT']['data_1']
B = config_ini['DEFAULT']['data_2']
C = config_ini['DEFAULT']['data_3']
6.マウス操作、クリックなどの自動化
import pyautogui
pyautogui.moveTo(15,1100,1)
pyautogui.moveTo(15,1050,1)
pyautogui.click(15,1050,1,1,'left')
pyautogui.moveTo(15,1020,1)
pyautogui.click(15,1020,1,0.5,'left')
pyautogui.moveTo(15,930,1)
pyautogui.click(15,930,2,1,'left')
7.ファイル削除
import os from tkinter
import filedialog as tkdialog
from ctypes import *
t= windll.user32
#t.MessageBoxW(0,"","",0x00000040)
#fname = tkdialog.askopenfilename(filetypes=[('all files','*.*')],initialdir=os.getcwd())
fnama="C:/Users/alplab/Desktop/test.ini"
t.MessageBoxW(0,"削除するフォルダを選択してください。","削除するフォルダを選択",0x00000040)
fdir = tkdialog.askdirectory(initialdir=os.getcwd())
#print (fname)
#print(fdir)
f1 = open(fname,'w+')
X=fdir
f1.write(X)
f1.close()
f = open(fname,'r')
#line = f.readlines()
# 文字列としてリストとして読み込む(改行文字も含まれる)
line = f.read()
# 文字列としてリストとして読み込む(改行文字も含まれる)
#print(line)
f.close
P=os.listdir(line)
n=(len(P))
for am in P:
os.remove (line +"/" + am)
t.MessageBoxW(0,"削除しました。","フロー完了",0x00000040)
8.Webスクレイピング(selenium)
import selenium
import time
from selenium import webdriver
browther=webdriver.Chrome("C:/Users/alplab/AppData/Local/Programs/Python/Python37-32/Lib/site-packages/selenium/webdriver/chrome/chromedriver.exe")
browther.get("https:///")
time.sleep(3)
browther.find_element_by_id("LoginId").send_keys("0000000000")
browther.find_element_by_id("Password").send_keys("Pasword")
browther.find_element_by_id("loginBtn").click()
time.sleep(5)
browther.find_element_by_xpath('xxxxxxxxxx').click()
9.その他:PIPが起動しないとき(コマンドプロンプト)
pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org pyautogui
10.簡単な辞書アプリ(CSV読み込み型)
dictionary.csvの内容を準備します。
同じディレクトリにCSVをおいてpythonを起動すると検索・登録ができる。
# tkinterとcsvモジュールをインポートします
import tkinter as tk
import csv
# tkinter.messageboxをインポートします
import tkinter.messagebox
# CSVファイルのパスを指定します
csv_file = "dictionary.csv"
# tkinterのウィンドウを作成します
window = tk.Tk()
window.title("辞書アプリ")
window.geometry("300x270") # 画面サイズを縦長で少しスリムにする
# ラベルを作成します
label1 = tk.Label(window, text="単語を入力してください")
label2 = tk.Label(window, text="意味")
# エントリーを作成します
# 単語を入力するエントリー
entry = tk.Entry(window, width=30)
# 意味を表示するエントリー
# 編集可能に設定します
# widthオプションで幅を数値で指定します
output = tk.Text(window, height=10, width=40)
# 意味を検索する関数を定義します
def search():
# CSVファイルから辞書を作成します
# キーは単語、値は意味です
dictionary = {}
with open(csv_file, "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
word, meaning = row
dictionary[word] = meaning
# 入力された単語を取得します
word = entry.get()
# 辞書に単語があれば、意味を取得します
if word in dictionary:
meaning = dictionary[word]
# 辞書に単語がなければ、メッセージを表示します
else:
meaning = "単語が見つかりませんでした"
# 意味を表示するエントリーに値を設定します
output.delete(1.0, tk.END) # 全てのテキストを削除する
output.insert(1.0, meaning) # 最初の位置にテキストを挿入する
# 単語と意味を登録する関数を定義します
def register():
# 入力された単語を取得します
word = entry.get()
# CSVファイルを読み込みモードで開きます
with open(csv_file, "r", encoding="utf-8") as f:
# readerオブジェクトを作成します
reader = csv.reader(f)
# readerオブジェクトをforループで回します
for i, row in enumerate(reader):
# 各行の単語と入力された単語を比較します
if word == row[0]:
# もし単語が一致したら、メッセージボックスを表示して、上書きするかどうかを尋ねます
# tkinter.messageboxのaskyesnoメソッドを使います
answer = tkinter.messagebox.askyesno("登録確認", "単語が重複しています。上書きしますか?")
# ユーザーの選択に応じて処理を分岐します
if answer:
# ユーザーが「はい」を選んだら、意味を取得して、CSVファイルの対応する行に上書きします
meaning = output.get("1.0", "end-1c")
# CSVファイルを読み込みモードで開きます
with open(csv_file, "r", encoding="utf-8") as f:
# 全ての行をリストに読み込みます
lines = list(csv.reader(f))
# 上書きする行の意味を更新します
lines[i][1] = meaning
# CSVファイルを書き込みモードで開きます
with open(csv_file, "w", encoding="utf-8", newline="") as f:
# writerオブジェクトを作成します
writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_ALL)
# リストをCSVファイルに書き込みます
writer.writerows(lines)
entry.delete(0, tk.END)
output.delete(1.0, tk.END)
tkinter.messagebox.showinfo("更新完了", "単語と意味を上書きしました")
return
else:
# ユーザーが「いいえ」を選んだら、何もせずに関数を終了します
return
# forループを抜けたら、単語と意味をリストに格納します
meaning = output.get("1.0", "end-1c")
data = [word, meaning]
# CSVファイルを追記モードで開きます
with open(csv_file, "a", encoding="utf-8", newline="") as f:
# writerオブジェクトを作成します
writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_ALL)
# リストをCSVファイルに書き込みます
writer.writerow(data)
# メッセージボックスを表示します
entry.delete(0, tk.END)
output.delete(1.0, tk.END)
tkinter.messagebox.showinfo("登録完了", "単語と意味を登録しました")
# ボタンを作成します
# 検索ボタン
# クリックすると、search関数が呼び出されます
button1 = tk.Button(window, text="検索", command=search)
# 登録ボタン
# クリックすると、register関数が呼び出されます
button2 = tk.Button(window, text="登録", command=register)
# すべてのウィジェットを配置します
# gridメソッドを使って、ウィジェットを左寄せにする
label1.grid(row=0, column=0, sticky=tk.W)
entry.grid(row=1, column=0, columnspan=2, padx=5, pady=3, sticky=tk.W+tk.E)
button1.grid(row=2, column=0,sticky=tk.W)
label2.grid(row=3, column=0, sticky=tk.W)
output.grid(row=4, column=0, columnspan=2, padx=5, pady=3, sticky=tk.W+tk.E)
button2.grid(row=5, column=0, sticky=tk.W)
# tkinterのメインループを開始します
window.mainloop()