【问题标题】:How can I parse this list of comma separated values如何解析这个逗号分隔值列表
【发布时间】:2013-09-01 04:03:42
【问题描述】:

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

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

知道为什么这不起作用吗?或者,有没有更好的方法来完成我想要的输出?也许正则表达式会更好?

【问题讨论】:

  • 请注意,制作一个列表,然后附加每一行可以替换为ul = list(dict_reader)

标签: python regex csv


【解决方案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')

您也可以使用反斜杠来转义换行符,但括号更易于阅读。

【讨论】:

  • 谢谢,这修复了回溯!但是,我现在意识到我的代码并不能解决我的问题。当我需要新行上的每个用户和权限对时,我仍然将用户及其权限放在一行上。
  • @JamesNicholson 好吧,现在已经修复了,再试一次,如果您有更多问题,请随时发布另一个问题 :)。
【解决方案2】:
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))

【讨论】:

  • -1 - 没有理由重新发明轮子 - 提问者首先使用 csv 模块做了正确的事情。
  • @Lattyware:是的。但我没有太多时间发布csvesque 答案,而是选择了快速回复
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 2010-11-29
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多