0

奇妙な csv ファイルがあります。サブセクションがあり、各サブセクションには csv 形式のデータがあります。

データ例:

Device Name: Test-0001

Sub section 1
header 1, header 2, header 3,header 4,.......header n
field 1, field 2, field 3, field 4, .......field n

Sub section 2
header 1, header 2, header 3,header 4,.......header n
field 1, field 2, field 3, field 4, .......field n

.....

Sub section n

header 1, header 2, header 3,header 4,.......header n
field 1, field 2, field 3, field 4, .......field n

Device Name: Test2-0002
and same format afterwards....

次の「デバイス名:」が来るまで、各「デバイス名:」をすべてのサブセクションにマップしようとしています。

どうすればいいですか?

4

1 に答える 1

0

デバイスをキーとして、行のリストを値として取る辞書を定義しようとします。linesそれがファイルの行のリストであると仮定します:

with open(your_file_name, "r") as f:
    lines = f.readlines()

devices = {}
key = None
for line in lines:
    if not line.strip():
        continue
    if line.startswith("Device Name"):
        key = get_key(line)
        devices[key] = []
    else:
        devices[key].append(line)

どこでget_keyあなたが定義する関数であり、それはDevice Name: Test2-0002あなたが望むものにような行を変換します.

たとえば、 のようなキーが必要な場合は、次のようにDevice Name: Test2-0002定義できます。これは、 a が指定されたときに処理なしでまったく同じものを返す関数です。get_keyget_key = lambda line: linelineline

キーを のようにしたい場合はTest2-0002、関数を記述して文字列get_keyを削除するDevice Name:か、文字列の一部を':'...

これはかなり基本的な解決策ですが、ファイルの行を一度に保存することを気にしない場合は機能するはずです。これが問題になる場合はfile.readline()、リストの代わりにa を使用してlinesください。

もう少し高度なソリューションは、mmapモジュールに基づいている可能性があります: ラインの位置を見つけてDevice Name保存します。その後、セクションごとに読むことができます。

于 2012-08-27T10:42:28.033 に答える