最新の記事

PySimpleGUIでボタンをセンタリングする

私が知っているのは今のところ以下の2通り

sg.Column() を使う方法

sg.Column()の中にボタンを入れて、justificationを’c’にする

layout = [
    [ sg.Column([
        [sg.Button('OK', key='ok', size=(20,1))]
    ], justification='c') ]
]

sg.Push() を使う方法

ボタンの両側にsg.Push()を配置する

layout = [
    [ sg.Push(), sg.Button('OK', key='ok', size=(20,1), sg.Push() ]
]

分離したカタカナの濁点を結合して1文字にする方法

「カ゛」のように、カタカナの濁点だけで1文字になっているテキストを、結合して「ガ」に変換する方法です。

import re
import unicodedata

def convert_dakuten(chars):
    if not type(chars) == str:
        pass
    else:
        chars = re.sub(r'\u309B','\u3099',chars)
        chars = re.sub(r'\u309C','\u309A',chars)
        return unicodedata.normalize('NFC',chars)


print(convert_dakuten('カ゛'))

# ガ

カ゛」はUnicodeで表記すると、\u30AB\u309Bとなります。
一方、「ガ」は\u30ACまたは\u30AB\u3099の2通りで表すことができます。
\u30ACは「合成済み文字」、\u30AB\u3099は「結合文字列」と言います。)

つまり、文字の後に\u3099をつけるとつけると濁点になるので、
1文字の濁点「゛」部分を\u3099に置換することで「ガ」にすることができます。

さらに、unicodedeta.normalizeNFCを指定することで、合成済み文字に変換することができます。

同様に、半濁点は\u309C\u309Aに変換します。

PythonでCSVファイルの余計なスペースを削除する方法

CSVファイルの半角スペースだけが入っている部分を何もない状態にする必要があり、変換するコードを書きました。

'c1','c2','c3'
1,2,3
1,' ',3
1,2,3

こうなっているのを、

'c1','c2','c3'
1,2,3
1,,3
1,2,3

こんなふうに置換したいのです。

標準ライブラリのcsvにreaderという関数があり、skipinitialspaceというパラメータがデフォルトでfalseになっているので、これをTrueに指定すると、スペースを無視して取り込むことができます。

import csv

csv_file = open('sample.csv', 'r', encoding='cp932', errors='', newline='')
f = csv.reader(csv_file, delimiter=',', doublequote=True, lineterminator='\r\n', quotechar="'", skipinitialspace=True)
newfile = open('sample_nospaces.csv', 'w', encoding='cp932')
writer = csv.writer(newfile, doublequote=True, lineterminator='\n')
header = next(f)
writer.writerow(header)
for row in f:
    row = row
    writer.writerow(row)
csv_file.close()

ちなみに、pandasのisin()を使うと、該当箇所を特定することができます。

import pandas as pd

df = pd.DataFrame([
    [1,2,3],
    [1,' ',3],
    [1,2,3]
], columns=['c1','c2','c3'])

print(df.isin([' ']))

#      c1     c2     c3
# 0  False  False  False
# 1  False   True  False
# 2  False  False  False

下記のようにすると該当箇所だけを抽出することができ、件数のカウント等に利用できます。

index = df[df.isin([' '])].dropna(how='all').index
print(df.iloc[index])

#    c1 c2  c3
# 1   1      3