2017-03-14 8 views
-1

私は、普通の方法でPythonでCSVファイルを読む方法を完全に認識しています。リストを解析できることも承知しています(例:["a, b, 123"])。どちらもジェネレータと利回りのために動作します。csv古い方法を読む

私の問題が若干異なります。

  • 入力がdict
  • {"line": "a, b, 123", "line_count": 555, ..}のような出力が同じ dict
    {"line": "a, b, 123", "line_count": 555, .., "csv": ["a", "b", "c"]}

よう"csv"属性を簡単かつ非常に伝統的に延長すべきですアプローチは(擬似コード):

def my_csv_reader(myconfig): 
    my_reader = CsvReader(**myconfig) 
    for line in some_gen_providing_the_list_of_dicts: 
     line["csv"] = csv.reader(line["line"]) (1) 
     yield line 

私は実際にマークされた行(1)を交換することにより、このアプローチを使用することができるよ:

line["csv"] = csv.reader([line["line"]], **myconfig) (1) 

しかし、私は500のMIO行を解析する必要があり、一つ一つのライン用のCSVオブジェクトの作成と初期化おそらくたくさんのゴミを作り、実際には不要です。私はまた、ヘッダー行、DictReader、等はもはや組み込みになりません。

  • csv readerオブジェクトを作成します。
  • 退屈な古い形式のto_csv(my_line)関数を呼び出し、その行のcsvを返します。

Python 3.xで何とか可能ですか?

+1

いいえ、伝統的な方法は、ファイルオブジェクトのような行の繰り返し可能性からCSVリーダーを作成して、各行に別々のリーダーを作成しないことです。 – TigerhawkT3

答えて

0

これはどういう意味ですか?

def to_csv(s): 
    s = s.split(',') 
    s = [t.strip() for t in s] 
    return s 

def csv_reader(dicts): 
    for d in dicts: 
    d['csv'] = to_csv(d['line']) 
    yield d 
+0

あなたのソリューションでは、ヘッダー、DictReader、方言などをサポートしていますか? – Juergen