1

コンマ区切りのユーザーとそのアクセス許可のリストがあり、一部のユーザーには最大 8 つのアクセス許可があります。

user_a, permission_1
user_b, permission_1, permission_2
user_c, permission_1, permission_2, permission_3

すべてのユーザーと権限のペアが別の行にある、カンマ区切りのユーザーと権限のリストを出力する必要があります。

user_a, permission_1
user_b, permission_1
user_b, permission_2
user_c, permission_1
user_c, permission_2
user_c, permission_3

csv モジュールを使用する以下の私の python コードは現在動作していません:

import csv

with open('user_list.csv') as user_list:
    dict_reader = csv.DictReader(user_list)
    ul = []
    for row in dict_reader:
        ul.append(row)

with open('output.txt','w') as output:
    fields = 'USER','PERM1','PERM2','PERM3','PERM4',
    'PERM5','PERM6','PERM7','PERM8'
    dict_writer = csv.DictWriter(output, fields)
    csv.DictWriter.writeheader(dict_writer)
    for i in ul:
        dict_writer.writerow(i)

それは私に次のトレースバックを与えています:

Traceback (most recent call last):
  File "cops_ul_parse.py", line 15, in <module>
    dict_writer.writerow(i)
  File "C:\Python27\lib\csv.py", line 148, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "C:\Python27\lib\csv.py", line 144, in _dict_to_list
    ", ".join(wrong_fields))
ValueError: dict contains fields not in fieldnames: PERM8, PERM7, PERM6, PERM5

なぜこれが機能しないのか考えていますか? または、目的の出力を達成するためのより良い方法はありますか? 多分正規表現がうまくいくでしょうか?

4

2 に答える 2

1

問題は次の行です。

fields = 'USER','PERM1','PERM2','PERM3','PERM4',
'PERM5','PERM6','PERM7','PERM8'

あなたのコードはfields = 'USER','PERM1','PERM2','PERM3','PERM4',(タプルとリストは最後の項目の後にカンマを付けることができることを思い出してください) 実行してから、別のタプル ( 'PERM5','PERM6','PERM7','PERM8') を作成し、それに対して何もしません。

次に、を作成するとcsv.DictWriter、最初のタプルのフィールドのみが含まれるため、エラーが発生します。

解決策は簡単です。タプルを括弧で囲みます。これにより、暗黙の行継続が得られます。

fields = ('USER','PERM1','PERM2','PERM3','PERM4',
          'PERM5','PERM6','PERM7','PERM8')

バックスラッシュを使用して改行をエスケープすることもできますが、括弧を使用した方が読みやすくなります。

于 2013-08-28T21:56:11.613 に答える
0
for perm in listOfPermissions:
    user, perms = perm.split(',', 1)
    for p in perms:
        print "%s, %s" %(user, p)

これをファイルに書き込むには:

with open('path/to/file', 'w') as outfile:
    for perm in listOfPermissions:
        user, perms = perm.split(',', 1)
        for p in perms:
            outfile.write("%s, %s\n" %(user, p))
于 2013-08-28T21:51:45.610 に答える