3

私のPythonアプリケーションでは、さまざまなフィールドの値をテキストファイルに保存しており、Excelで読みやすい方法で開くことができるようにCSV形式を使用することにしました。ファイルの値を変更して、アプリにインポートすることもできます。ファイルの形式は次のようになります。

Category 1, Param 1, Param 2, Param 3, Param 4
Command 1, 100, 123, 456, 1000
Command 2, 980, 312, 567, 882
Command 3, 0, 111, 584, 223
Category 2, Param A, Param B, Param C
Command A, 24, 14, 66
Command B, 59, 0, 123

CSVファイルの保存はそれほど問題ではありませんが、各カテゴリに同じ量のパラメータがないため、カテゴリをどのように分離するかが気になります。私はcsvPythonのモジュールとDictReaderメソッドを使用してきましたが、すべてを取得して同じバスケットに入れるだけです。したがって、たとえば、このコードを使用する場合:

def parseCsvFile(self, paramsfile):
    with open(paramsfile, 'rb') as csvfile:
        paramNames = ['Category', 'Param 1', 'Param 2', 'Param 3', 'Param 4']
        paramsReader = csv.DictReader(csvfile, fieldnames=paramNames)
        for row in paramsReader:
            print row['Category']

私はこの結果を得るでしょう:

Category 1
Command 1
Command 2
Command 3
Category 2
Command A
Command B

カテゴリ1のデータを最初に取得し、次にカテゴリ2のデータを別のフィールド名のセットで取得する方法はありますか?

ありがとう。

4

1 に答える 1

2

csv.DictReader本当の問題は、実際にはこの種のファイル用に設計されていないことだと思います。特に、ファイル全体の各行をアドレス指定するために同じ辞書を使用する必要があることを前提としています。しかし、途中で線の種類を変更しています。代わりに、を使用する必要がありますcsv.reader

あなたはまだあなたのデータを辞書として扱いたいと思っていると思います。その場合は、自分で辞書を作成するだけです。また、データを整数として処理する必要があると思います。intそうでない場合は、以下を関連するものに置き換えてください。以下は私があなたが望むと思うことをします:

def parseCsvFile(self, paramsfile) :
    import csv
    csvDict = {}
    category = 'Unknown Category'
    params = []
    with open(paramsfile, 'rb') as csvfile :
        paramsReader = csv.reader(csvfile)
        for row in paramsReader :
            if row[0].startswith('Category') :
                category = row[0]
                csvDict[category] = {}
                params = [p.strip() for p in row[1:] if p]
            else :
                csvDict[category][row[0]] = dict(zip(params, [int(p) for p in row[1:] if p]))
    return csvDict

返される辞書csvDictは、ネストされた辞書になります。ファイルの各セクションはディクショナリのキーになり、対応するアイテムは、そのセクションの各行をディクショナリとして保持する別のディクショナリになります。

于 2013-03-27T14:13:55.827 に答える