2

行ごとに空のリストに入れているcsvファイルがあるため、最終結果は、リスト内の各行を含むネストされたリストになります。

[[1.1,2.6,3,0,4.8],[3.5,7.0,8.0]....and so on.....].

問題は、ファイルの最後に空の文字列があり、次のような最終リストになります。

[[1.1,2.6,3,0,4.8],[3.5,7.0,8.0],['','','','','','','','','']]

これらを取り除く、またはリストに追加されないようにするにはどうすればよいですか。それらは非常に大きなcsvファイルなので、最初のリストに追加されるのをやめたいと思います。おそらく必要ないのに、非常に大きなリストを作成しているように感じます。これにより、メモリの問題が発生する可能性があります。これまでのコードは次のとおりです。

csvfile = open(file_path, 'r')
reader = csv.reader(csvfile)
data_list = []

for row in reader:
    data_list.append(row)
csvfile.close()
i = 0
file_data = []

while i < len(data_list):
    j = 0
    while j < len(data_list[i]):
        try:
            data_list[i][j] = float(data_list[i][j])
        except ValueError:
            pass            
        j += 1
    file_data.append(data_list[i])
    i += 1

print file_data
4

3 に答える 3

1

これは、コードを簡略化したもので、何をしようとしているのかを理解しやすく、Pythonic に近いものになっています。

最初にファイルを開いて読み取るには、withステートメントを使用してファイルが自動的に閉じられるようにし、CSV ファイルをループするジェネレーターを作成して、少なくとも 1 つの空白以外の列の値を含む行のみを取得し、各要素を float に変換します (ヘルパー関数を介して) 可能であれば、それ以外の場合は文字列のままにします。次にdata_list、データを追加する代わりに 1 つのステートメントを作成します...

with open(file_path) as fin:
    csvin = csv.reader(fin)
    rows = (map(to_float_if_possible, row) for row in csvin if any(row))
    data_list = list(rows)

ヘルパー関数は次のように定義されます。

def to_float_if_possible(text):
    try:
        return float(text)
    except ValueError as e:
        return text

numpy見た目から、またはpandasこのタイプのデータを扱うときに検討したい場合があります。

于 2013-05-23T07:24:34.097 に答える