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の操作も別途書く。