【问题标题】:Query in Editing CSV file编辑 CSV 文件中的查询
【发布时间】:2018-11-22 10:38:16
【问题描述】:

我在列表中有列名,我想将值 1 分配给这些列名,并将值 0 分配给其余列。 例如。

perms_name = ['name','place','thing']

最初的 CSV 看起来像:

name,age,place,thing,phone_no

我想让 csv 看起来像:

name,age,place,thing,phone_no
1,0,1,1,0

我可以通过这个简单地做到这一点

with open('eggs.csv','a') as csvfile:
    fieldname = ["name","age","place","thing","phone_no"]
    writer = csv.DictWriter(csvfile,fieldnames=fieldname)
    writer.writeheader()

    writer.writerow(
        {'name': 1,'age':0,'place':1,'thing':1,'phone_no':0}
    )

但是他们有更快的方法吗,在这种情况下,它们只有 5 列,如果它们是 100 列,我只想将 1 分配给列表中提到的列。

【问题讨论】:

    标签: python python-3.x python-2.7 csv dictionary


    【解决方案1】:

    您可以通过** 运算符在 Python 3 中解压字典。结合dict.fromkeys,无需为每个字段显式写出键值:

    perms_name = ['name','place','thing']
    fieldname = ['name', 'age', 'place', 'thing', 'phone_no']
    
    d = {**dict.fromkeys(fieldname, 0), **dict.fromkeys(perms_name, 1)}
    
    {'age': 0, 'name': 1, 'phone_no': 0, 'place': 1, 'thing': 1}
    

    定义你的字典一次然后使用:

    writer.writerow(d)
    

    【讨论】:

      【解决方案2】:

      对于 jpp 的回答,您可以使用稍微令人困惑的列表推导来构建字典。

      perms_name = ['name','place','thing']
      fieldname = ['name', 'age', 'place', 'thing', 'phone_no']
      d = {field : (1 if field in perms_name else 0) for field in fieldname}
      # {'name': 1, 'age': 0, 'place': 1, 'thing': 1, 'phone_no': 0}
      

      如果有任意数量的列从 csv 中读取它们而不是将它们硬编码到脚本中,这也可能是值得的。

      【讨论】:

      • 成功了,非常感谢。你能帮我做一个新的查询吗,如果在与上述相同的问题中我想为名称字段分配字符串值并且其余字段与上面提到的相同,我将如何构建我的字典。
      • 可能最简单的方法是像上面那样构建它,然后在字典理解之后(但在明显写之前)重新分配d['name'] = 'some string value'
      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      相关资源
      最近更新 更多