【Python】csv・txtファイルの行データを読み込み、リストに1次元配列として格納する


読み込んだ行データをリストに格納する作業がよくあったので、関数化して実装していきたいと思います。

実装

Python 3.7.6

  • txtファイル
txt
Apple
Grape
Orange
Melon
Peach
  • CSVファイル

引数にtxtかcsvのfileパスを指定すると、読み込んだデータをリストとして返します。

import csv 
import itertools # 2次元配列=>1次元配列にするため


TEXT_FILE = 'sample.txt'
CSV_FILE = 'sample.csv'

def read_txtfile_as_list(filePath=None):
    """ 
    テキストファイルを読み込み、リストとして返します。

    Parameters
    ----------
    filePath : str

    Returns
    -------
    item_list : list of str
    """
    with open(filePath, 'r') as f:
        text_data = [line.strip() for line in f]
    return text_data

def read_csvfie_as_list(filePath=None):
    """ 
    CSVファイルを読み込み、リストとして返します。

    Parameters
    ----------
    filePath : str 

    Returns
    -------
    item_list : list of str
    """
    with open(filePath, 'r') as f:
        csv_data =  [line for line in csv.reader(f)]
    # return sum(csv_data, []) 簡易的な書き方 こっちだと処理が遅い
    return list(itertools.chain.from_iterable(csv_data))

def read_file_as_list(filePath=None):
    """ 
    テキストファイルかCSVファイルを読み込み、リストとして返します。

    Parameters
    ----------
    filePath : str

    Returns
    -------
    item_list : list of str
    """
    if filePath[-4:] == '.txt':
        with open(filePath, 'r') as f:
            text_data = [line.strip() for line in f]
        return text_data
    elif filePath[-4:] == '.csv':
        with open(filePath, 'r') as f:
            csv_data =  [line for line in csv.reader(f)]
            return list(itertools.chain.from_iterable(csv_data))
    else:
        return None


# テキストファイルの中身を表示
text_samp1 = read_txtfile_as_list(TEXT_FILE)
print(text_samp1)

# OUTPUT: ['Apple', 'Grape', 'Orange', 'Melon', 'Peach']

# CSVファイルの中身を表示
csv_samp1 = read_csvfie_as_list(CSV_FILE)
print(csv_samp1)

# OUTPUT: ['dog', 'cat', 'cow', 'fox', 'monkey']

# テキスト・CSVファイルの中身を表示
text_samp2 = read_file_as_list(TEXT_FILE)
csv_samp2 = read_file_as_list(CSV_FILE)

print(text_samp2)
print(csv_samp2)

# OUTPUT: ['Apple', 'Grape', 'Orange', 'Melon', 'Peach']
# OUTPUT: ['dog', 'cat', 'cow', 'fox', 'monkey']

書いている途中で行データだけを読み込むのであれば、標準のreadlinesメソッドで読み込めるので、csvライブラリをインポートする必要性はなかったなーと思ったのですが、今後、csvファイルの中身をリストにする機会があるかもしれないと思ったので、一応、残しておきます。