1

次のようにプロパティをオーバーライドしてcsv.Dictreader.fieldnames、csv ファイルからすべてのヘッダーを空白なしで小文字で読み取ります。

import csv
class MyDictReader(csv.DictReader):

    @property
    def fieldnames(self):
        return [field.strip().lower() for field in super(MyDictReader, self).fieldnames]

今私の質問は、どのように自動的にフィールド名とクエリにアクセスできstrip()ますlower()か?

これは、私が手動で行う方法です:

csvDict = MyDictReader(open('csv-file.csv', 'rU'))

for lineDict in csvDict:
    query = ' Column_A'.strip().lower()
    print(lineDict[query])

何か案は?

4

2 に答える 2

2

Pedro Romano の提案に基づいて、次の例をコーディングしました。

import csv

class DictReaderInsensitive(csv.DictReader):
    # This class overrides the csv.fieldnames property.
    # All fieldnames are without white space and in lower case

    @property
    def fieldnames(self):
        return [field.strip().lower() for field in super(DictReaderInsensitive, self).fieldnames]

    def __next__(self):
        # get the result from the original __next__, but store it in DictInsensitive

        dInsensitive = DictInsensitive()
        dOriginal = super(DictReaderInsensitive, self).__next__()

        # store all pairs from the old dict in the new, custom one
        for key, value in dOriginal.items():
            dInsensitive[key] = value

        return dInsensitive

class DictInsensitive(dict):
    # This class overrides the __getitem__ method to automatically strip() and lower() the input key

    def __getitem__(self, key):
        return dict.__getitem__(self, key.strip().lower())

次のようなヘッダーを含むファイルの場合

  • "列_A"
  • "列_A"
  • 「列A」
  • 「列A」
  • ...

次のように列にアクセスできます。

csvDict = DictReaderInsensitive(open('csv-file.csv', 'rU'))

for lineDict in csvDict:
    print(lineDict[' Column_A']) # or
    print(lineDict['Column_A']) # or
    print(lineDict[' column_a']) # all returns the same
于 2012-10-19T08:42:03.557 に答える
1

次の 2 つの手順で行う必要があります。

  1. パラメータにを適用するメソッドをdict使用して特殊化を作成します。__getitem__.strip().lower()key
  2. 特殊化されたクラスをオーバーライド__next__して、スーパークラスのメソッドMyDictReaderによって返された辞書で初期化された特殊な辞書の 1 つを返します。csv.DictReader__next__
于 2012-10-18T17:41:13.393 に答える