ぺーぱーふぇいす

雑記と備忘録。私はプログラマ。

【Python】文字列操作カンペ

Pythonで文字列加工したり、ファイルから文字列読み書きする際の処理まとめ。カンニングペーパー。

よく忘れるので。
たまに修正するかも。ちなみにPython3.x系。

まとめスクリプト

#coding: UTF-8
# python 文字列操作いろいろ
# create: 2017/10/01
# update: 2018/01/01

# 参考: Python文字列操作マスター - Qiita https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887
#       文字列 - pythontips @ ウィキ - アットウィキ https://www23.atwiki.jp/pythontips/pages/12.html

if __name__ == '__main__':
    
    # 文字列の結合1
    # memo> 文字列の結合子は'+'
    print('M4' + ',' + 'Vz61' + ',' + 'PSG-1') #=>M4,Vz61,PSG-1
    
    # 文字列の結合2
    # memo> 文字配列を結合する方法。singBuilderとかの代わりになるかも。
    list = []
    list.append('M4')
    list.append('Vz61')
    list.append('PSG-1')
    print('|'.join(list)) #=>M4|Vz61|PSG-1
    
    # 文字列を1文字ずつ読み込む
    s = 'M1911'
    for c in s:
        print(c) # 1回目: #=>M 2回目: #=>1 3回目: #=>9 4回目: #=> 5回目: #=>1
    
    # 文字列を1行ずつ読み込む
    s = """M4
Vz61
PSG-1
"""
    for line in s.splitlines():
        print(line) #1回目: #=>M4 2回目: #=>Vz61 3回目: #=>PSG-1
    
    # テキストファイルの書き込み
    # memo> 上書き'w', 追記は'a', それぞれファイルが存在しない場合は新規作成。
    #       読み書き両対応は'w+'か'a+'。
    with open('test.txt', 'w') as f:
        f.write('TAR-21\n')
        f.writelines(['FAMAS', 'AUG', 'P90'])   #=>FAMASAUGP90
    
    # テキストファイルを読み込む
    # memo> 全部読み込む
    with open('test.txt', 'r') as f:
        print(f.read())
    
    # memo> 1行ずつ処理(一度に読み込み)
    lines = ''
    with open('test.txt', 'r') as f:
        lines = f.readlines()
    
    for line in lines:
        print(line)
    
    # memo> 1行ずつ処理(都度読み込み)
    with open('test.txt', 'r') as f:
        line = f.readline()
        
        while line:
            print(line)
            line = f.readline()
    
    # フォーマット1
    # memo> %s...文字列
    #       %d...整数
    #       %f...小数として展開 ...他いろいろ
    print(u'分類:%s 名前:%s 製造国:%s' % (u'アサルトライフル', u'M4', u'アメリカ')) #=>分類:アサルトライフル 名前:M4 製造国:アメリカ
    
    dic = dict(type='サブマシンガン', name='Vz61', country='チェコスロバキア')
    print(u'分類:%(type)s 名前:%(name)s 製造国:%(country)s' % dic) #=>分類:サブマシンガン 名前:Vz61 製造国:チェコスロバキア
    
    # フォーマット2
    # memo> パラメタ渡し
    frm = u'分類:{0} 名前:{1} 製造国:{2}'
    print(frm.format(u'スナイパーライフル', u'PSG-1', u'ドイツ')) #=>分類:スナイパーライフル 名前:PSG-1 製造国:ドイツ
    
    # フォーマット3(数値)
    # memo> 0埋め
    frm = '{:0>5}'
    print(frm.format(123)) #=>00123
    
    # memo> 小数点
    frm = '{:.2f}'
    print(frm.format(1.5))  #=>1.50
    
    # memo>  3桁区切り
    frm = '{:,}'
    print(frm.format(123456789)) #=>123,456,789
    
    # memo> 3桁区切り+小数点
    frm = '{:,.5f}'
    print(frm.format(12345.678)) #=>12,345.67800
    
    # 置き換え
    # memo> 正規表現を使う場合は`import re`
    s = u'男の子'
    print(s.replace(u'子', u'娘')) #=>男の娘
    
    # 正規表現
    # memo> 正規表現による検索とか置き換えとか
    import re
    
    # 検索
    s = 'AK47AK74AK102AK47S'
    pattern = r'AK..'
    
    # 最初に一致した文字を返すsearch()。match()もあるけど、そっちはおそらく使わないかな。
    print(re.search(pattern, s)) #=><_sre.SRE_Match object; span=(0, 4), match='AK47'>
    print(u'最初に一致した文字列: ' + re.search(pattern, s).group()) #=>最初に一致した文字列: AK47
    print(u'最初に一致した開始位置: ' + str(re.search(pattern, s).start())) #=>最初に一致した開始位置: 0
    print(u'最初に一致した終了位置: ' + str(re.search(pattern, s).end())) #=>最初に一致した終了位置: 4
    print(u'最初に一致した開始位置と終了位置の感覚: ' + str(re.search(pattern, s).span())) #=>最初に一致した開始位置と終了位置の感覚: (0, 4)
    
    # 一致した文字列を全てリストとして返すfindAll()。
    resultList = re.findall(pattern, s)
    if resultList:
        print(resultList) #=>['AK47', 'AK74', 'AK10', 'AK47']
    
    # 一致した文字列をイテレータとして返すfinditer()。
    resultIter = re.finditer(pattern, s)
    for match in resultIter:
        print(match.group())        # 1回目:#=>AK47     2回目:#=>AK74
        print(str(match.start()))   # 1回目:#=>0        2回目:#=>4
        print(str(match.end()))     # 1回目:#=>4        2回目:#=>8
        print(str(match.span()))    # 1回目:#=>(0, 4)   2回目:#=>(4, 8)
    
    s = 'ippai'
    print(re.sub(r'^i', 'o', s)) #=>oppai
    
    # 置き換え
    s = 'ippai'
    print(re.sub(r'^i', 'o', s)) #=>oppai
    
    # システム日付取得
    # memo> よくあるシステム日付表示用
    import datetime
    now = datetime.datetime.today()
    print(now.strftime("%Y/%m/%d %H:%M:%S.%f")) #=> 2018/02/26 18:44:10.139795
    

余談

あとでCSVとxlsxの操作も別途書く。