70804


数値データが入ったcsvファイルがあります．形は2000行1列で各数値は改行で分けられています．  
このcsvファイルを`[18231,1299,3001,...,2198]`のようにint型データのリストに変換したいです．  
以下のコードを実行したのですが結果が思うような形にならないので，どなたか解決策を教えていただけませんか？ よろおしくお願いします．

[code]

    with open('data.csv') as f:
        reader = csv.reader(f)
        data = list(reader)
    print(data)
    
[/code]

> [['1128978'], ['117328'],..., ['24043']]


CC BY-SA 4.0
2020-09-29T05:40:36.207
70797
2020-09-29T08:13:42.037
2020-09-29T05:46:29.403
36750
36750
question
python python3 csv
csvからint型のリストへ変換する方法


こんな感じですかね。

[code]

    import csv
    import itertools
    with open('data.csv') as f:
        reader = csv.reader(f)
        data = [int(i) for i in list(itertools.chain.from_iterable(reader))]
    print(data)
    
[/code]


CC BY-SA 4.0
2020-09-29T07:50:28.367
70802
2020-09-29T07:50:28.367
8795
70797
answer


色々な方法がありますが、素直にテキストとして読み取って数値化するサンプルコードの1つ目の方法がお勧めです。

csvは本質的に2次元配列なので、ご質問のコードを1次元配列に直す場合は4つ目の方法で内包表記を使って1次元配列化とint化しているような処理が必要です。

**data.csv**

[code]

    データ
    18231
    1299
    3001
    2198
    
[/code]

**サンプルコード**

[code]

    # 1.テキストとして読み取って単純に数値化する
    with open("data.csv") as f:
        # 数値化できるものだけ数値化
        data = [int(l) for l in f.read().splitlines() if l.isdecimal()]
        print(data)
    
    # 2.csvを読み取って1列目を配列化する(ヘッダなし)
    # cf: https://stackoverflow.com/a/46250109
    import csv
    
    data = []
    with open('data.csv', newline='') as inputfile:
        for row in csv.reader(inputfile):
            if not row[0].isdecimal():   # 数値判定(不要なら削除)
                continue                 # 同上
            data.append(int(row[0]))
    
    print(data)
    
    # 3.csvを読み取って任意の列を配列化する(ヘッダあり)
    import csv
    
    data = []
    with open('data.csv', newline='') as inputfile:
        for row in csv.DictReader(inputfile):
            data.append(int(row['データ']))
    
    print(data)
    
    # 4.多次元配列を1次元配列に変換する
    import csv
    
    with open('data.csv') as f:
        reader = csv.reader(f)
        list = list(reader)
        del(list[0])          # ヘッダ行を取り除く(不要なら削除)
        data = [int(l[0]) for l in list]
        print(data)
    
[/code]

**出力結果**

[code]

    [18231, 1299, 3001, 2198]
    [18231, 1299, 3001, 2198]
    [18231, 1299, 3001, 2198]
    [18231, 1299, 3001, 2198]
    
[/code]


CC BY-SA 4.0
2020-09-29T07:57:38.120
70803
2020-09-29T07:57:38.120
9820
70797
answer


以下は `pandas.read_csv()` を使う方法です。

[code]

    # generate random numbers data
    $ shuf -i 0-10000 -n 2000 > random_numbers.dat
    $ head -5 random_numbers.dat 
    8081
    893
    9727
    2013
    5957
    $ wc -l random_numbers.dat 
    2000 random_numbers.dat
    
    # load from file
    $ python3
    >>> import pandas as pd
    >>> lst = pd.read_csv('random_numbers.dat', header=None, dtype=int).iloc[:,0].tolist()
    >>> len(lst)
    2000
    >>> lst
    [8081, 893, 9727, 2013, 5957, ...
    
[/code]


CC BY-SA 4.0
2020-09-29T08:13:42.037
70804
2020-09-29T08:13:42.037
70797
answer