組み込みの python csv ライターに、配列内の特定の文字列値を無視させたいとしましょう (出力のコンマ間に値を配置しません)。例えば、
my_list = [4, 'foo', 'close', 9, 0]
csv output => 4, ,'close', 9, 0
ライターが無視するように指定するパラメーター「foo」を提供しますが、これは可能ですか? もしそうなら、誰かが実装を手伝ってもらえますか?
書き込む行の 2D リストがある場合、次のようなことができます。
lines = [[4, 'foo', 'close', 9, 0], [5, 'foo', 'close', 9, 0]]
import csv
with open("outfile.csv", "wb") as outf:
w = csv.writer(outf)
for line in lines:
w.writerow(["" if e == "foo" else e for e in line])
>>> import csv
>>> my_list = [4, 'foo', 'close', 9, 0]
>>> with open('test.csv', 'w') as fout:
w = csv.writer(fout, delimiter=',')
w.writerow([x if x != 'foo' else ' ' for x in my_list])
>>> print open('test.csv').read()
4, ,close,9,0
これを試すことができます:
ignored_strings = {'foo', 'ignored2', 'ignored3'}
my_list_filtered = [value if value not in ignored_strings else '' for value in my_list]
これにより、無視する各値が空の文字列に置き換えられます。その後、csv ライターを使用して新しいリストを印刷できます。
出力をどのように見せたいかに応じて、リスト内包表記の最後に「if」ステートメントを使用して、不要な値をリストから単純に削除することもできます。
次のようなものを使用して、リスト内で置換を行うことができます。
map(lambda x : str(x) if x != 'foo' else ' ', my_list)
join
出力文字列を作成するには、次のようにします。
','.join(map(lambda x : str(x) if x != 'foo' else ' ', my_list))