リストをカンマ区切りでテキストに出力
1. はじめに
CSVモジュールを使えば、効率的じゃないかと思われる方が大半だと思いますが、
急がば回れの精神で、無駄じゃない?と思われるようなことも、最初は、理解のために取り組んでおります。
この方法は、ちゃんとしたCSVではありません。
CSVにはRFCという規格でちゃんとフォーマットが決められているんですが、
この簡易的な方法ではその規格には対応できないんですね。たとえばデータの中に
カンマが含まれていた場合は、自分でダブルクオーテーションでエスケープしなきゃいけません。
2. 数値のリストをカンマ区切りでテキスト出力
これは、文字列ではないため、エラーとなります。
li = [1, 2, 3]
with open('test.txt', 'w', encoding='shift-jis') as f:
for x in li:
f.write(x)
# 結果
# write() argument must be str, not int
対応策としては、str() 関数を使い文字列へ変換します。
li = [1, 2, 3]
with open('test.txt', 'w', encoding='shift-jis') as f:
for x in li:
f.write(str(x))
# 結果
# テキスト内に、123 と記載れている。
テキスト内に以下の様に縦に記載されているわけではないということです。
1
2
3
理由は、write()メソッドは、デフォルトで改行されないため。
Print()で表示するときは、上記の様に、縦に表示される。
Print()は、デフォルトで改行が付いているため。
では、ここからが本題で、
リストの数値をカンマ区切りで、横に出力するには、どうしたら良いかを記載します。
対応方法としては
①print()関数のsep=で区切り文字を , に指定する。
②for文を使い、要素を一つ一つ文字列に変換する。
③map()関数を使い、リスト内の個々の要素に対して文字列変換を行う。
では、
①print()関数のsep=で区切り文字を,に指定する。は、以下のコードになります。
print(*li, sep=',', file=f)は、
*liでprint(1, 2, 3, ...) と同じになります。つまり、リストの内容(要素)を展開してくれます。
sep=','で区切り文字を、,に変更しています。そして、file=fは、書き込むための、ファイルオブジェクトを
渡していることになります。
li = [1, 2, 3]
with open('test.txt', 'w', encoding='shift-jis') as f:
print(*li, sep=',', file=f)
# 結果
1,2,3
次に、
②for文を使い、要素を一つ一つ文字列に変換する。は以下のコードになります。
こちらは、'for'文を使うためソースが長くなってしまうのがデメリットですね。
num_li = [1, 2, 3]
# 文字列に変換した要素を格納するための配列を用意する。
num2str_li = []
# str()関数を使い、文字列へ変換した値を、上記で用意したリストへ追加していく。
for x in num_li:
num2str_li.append(str(x))
with open('test.txt', 'w', encoding='utf-8') as f:
f.write(','.join(num2str_li))
# 結果
1,2,3
次に、
③map()関数を使い、リスト内の個々の要素に対して文字列変換を行う。は、以下のコードになります。
xは、1とか2とか1つの物なので、strしてjoinしても1つなので,の入りようが無いです。
joinするには、["1","2","3"]と文字列にする必要があるので、map関数を使い
",".join(map(str,li))のようにします。
li = [1, 2, 3]
with open('test.txt', 'w', encoding='shift-jis') as f:
f.write(",".join(map(str,li)))
# 結果
1,2,3
3. 文字列のリストをカンマ区切りで出力
文字列のリストの場合、joinしてあげれば,で連結できます。
str_li = ["犬", "ネコ", "豚"]
with open('test.txt', 'w', encoding='utf-8') as f:
f.write(",".join(str_li))
# 結果
# 犬,ネコ,豚
4. 最後に
- ツッコミ歓迎致します。皆様のツッコミが、私のスキルアップにつながります!!
- お題なんかも出していただけると助かります。
- 実務では、もっと、こういう使い方もあるよ!!みたいなアドバイスもいただけると嬉しいです。