私はcsv.DictReaderで解析している巨大なcsvを扱っていますが、キー名に基づいて結果の辞書のデータをトリムする最も効率的な方法は何でしょうか。 「JAN」を含むキーはそのまま使用してください。csv.DictReaderで値を間引く
ありがとうございます! row
私はcsv.DictReaderで解析している巨大なcsvを扱っていますが、キー名に基づいて結果の辞書のデータをトリムする最も効率的な方法は何でしょうか。 「JAN」を含むキーはそのまま使用してください。csv.DictReaderで値を間引く
ありがとうございます! row
result = {key:val for key, val in row.items() if 'JAN' in key}
がDictReader
から得られた辞書です。
あなたはこのような何か行うことができます:私は、次の内容の簡単なCSVファイルでこれをしようとしたとき
>>> with open('file.csv') as f:
... culled = [{k: d[k] for k in d if "JAN" in k} for d in csv.DictReader(f)]
を:
>>> with open('file.csv') as f:
... culled = [{k: d[k] for k in d if "JAN" in k} for d in csv.DictReader(f)]
...
>>> culled
[{'JAN11': '1', 'JAN12': '13'}, {'JAN11': '17', 'JAN12': '29'}]
:
JAN11,FEB11,MAR11,APR11,MAY11,JUN11,JUL11,AUG11,SEP11,OCT11,NOV11,DEC11,JAN12,FEB12,MAR12,APR12
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
私は以下の結果を得ました
これで、csv.DictReaderを使った汚い愚かな例が/etc/passwd
#!python
keepers = dict()
r = csv.DictReader(open('/etc/passwd', 'r'), delimiter=":", \
fieldnames=('login','pw', 'uid','gid','gecos','homedir', 'shell'))
for i in r:
if i['uid'] < 1:
continue
keepers[i['login']]=i
今、あなたの質問にそれを適用しようとしています...私は、「結果の辞書から」というフレーズに基づいて辞書の辞書を構築していたと推測しています。読み取り/オブジェクトはすべての入力レコードについて辞書を返すことは明らかです。したがって、ファイルのすべての行に1つの結果の辞書があります(一般的なCSVの "方言"のいずれかを仮定します)。
当然、私はif i['uid'] > 1
またはif "Jan" in i['gecos']
を使用していて、条件が満たされている場合は、自分の「保守担当者」にしか追加できませんでした。私はあなたの興味をそそられていないそれらの値を簡単にスキップする方法を強調するためにこの方法で書きました。残りの部分は関心のあるレコードでさまざまな面白いことをすることができます。
しかし、この回答はとても簡単なので、私は質問を理解していないと思わなければなりません。 (私は '/ etc/passwd'とコロンで区切られたリストを使用しています。というのも、これは非常によく知られたフォーマットであり、世界的に読めるコピーはLinux、Unix、MacOS Xシステム上ですぐに利用できるからです)。