LoginSignup
masashiiii
@masashiiii

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

python データ数に応じてリストに入れるには?

解決したいこと

csvファイルを読み込むにあたり、このようにデータ数に応じてリストに追加するにはどうしたらいいでしょうか。。。。?

図.png

このような表があり、行ごとにリストを作成したい
([museum], [art_gallery, museum], ...)
のですが、

csv_file = open('place2.csv', encoding="utf-8-sig")
data1 = csv_file.read()  # ファイル終端まで全て読んだデータを返す
csv_file.close()
lines1 = data1.split('\n') # 改行で区切る(改行文字そのものは戻り値のデータには含まれない)
for line in lines1:
    print(line)

これだと、

department_store,store,,,,
art_gallery,,,,,

というように、余計に,,,,が加わってしまいます。

ちなみにゴールは、
このリストと、事前に用意したリストとで重複する要素を数え上げる

といったところです。

0

1Answer

原因

末尾にコンマが付くのは、CSVファイルに空の値が出力されているためです。
テキストエディタでCSVファイルを開くことで確認できます。

方法A

表計算アプリから出力する際に、必要な列数に範囲を指定します。
CSVファイルに不必要なコンマが含まれなくなります。

メリット

コードを変更する必要がありません。

デメリット

前処理が必要になります。

方法B

行の末尾に空の値が含まれることを前提にして、プログラムで除去します。

メリット

前処理が必要ありません。

デメリット

コードが複雑になります。

方針

  • 空値は、行末にのみ出現する(空値以降に有効値は出現しない)ことを前提にします。
  • CSVの読み込みは(本論ではないので)、標準のモジュールを使用して済ませます。
  • 列数を揃える場合
    • 全ての要素を調べて、行ごとに空値でない要素数をカウントします。
    • 要素数が最大の行に合わせて、全ての行の要素数を揃えます。
  • 列数が不揃いで良い場合
    • 行から空値の要素を除去します。

対処と結果

以下でいかがでしょうか?

テストデータ

place2.csv
"department_store","store",,
"art_gallery","cafe",,
"art_gallery","museum","food",
"amuzement_park",,,

列数を揃える場合

code
import csv
with open('place2.csv', encoding="utf-8-sig") as csv_file:
    data1 = [l for l in csv.reader(csv_file)]
max_cols = max([len([c for c in l if c != '']) for l in data1]) # 行あたりの最大要素数を算出
data1 = [l[:max_cols] for l in data1] # 行を最大要素数でカット

print(f"data1=\n{data1}\n")
for line in data1:
    print(','.join(line))
result
data1=
[['department_store', 'store', ''], ['art_gallery', 'cafe', ''], ['art_gallery', 'museum', 'food'], ['amuzement_park', '', '']]

department_store,store,
art_gallery,cafe,
art_gallery,museum,food
amuzement_park,,

列数が不揃いで良い場合

code
import csv
with open('place2.csv', encoding="utf-8-sig") as csv_file:
    data1 = [l for l in csv.reader(csv_file)]
data1 = [[c for c in l if c!= ''] for l in data1] # 空の値を除去

print(f"data1=\n{data1}\n")
for line in data1:
    print(','.join(line))
result
data1=
[['department_store', 'store'], ['art_gallery', 'cafe'], ['art_gallery', 'museum', 'food'], ['amuzement_park']]

department_store,store
art_gallery,cafe
art_gallery,museum,food
amuzement_park
0

Your answer might help someone💌