繁体   English   中英

如何解析此逗号分隔值列表

[英]How can I parse this list of comma separated values

我有一个用逗号分隔的用户及其权限的列表,其中一些用户最多具有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

知道为什么这行不通吗? 或者,是否有更好的方法来完成所需的输出? 也许正则表达式会更好?

问题是此行:

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')

您也可以使用反斜杠来避开换行符,但是括号要好看得多。

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM