【问题标题】:Python csv(Two columns: key/value) to DictionaryPython csv(两列:键/值)到字典
【发布时间】:2019-04-03 10:14:06
【问题描述】:

是否可以将csv文件中的数据读入字典,第一列为key,第二列为第二列。

例如我有一个 csv 文件

code    msg
123456  Lorem ipsum dolor sit amet, consectetur adipiscing elit
345981  sed do eiusmo ut labore, et dolore magna aliqua;
459827  ullamco, laboris nisi ut aliquip ex ea commodo consequat.
490023  veniam, quis nostrud exercitation
345612  mollit anim id est laborum.

code 表示键,msg 表示与每个代码关联的值。

import csv
with open('test.csv') as f:
        reader = csv.reader(f)
        mydict = {rows[0]:rows[1:] for rows in reader}
        print(mydict)
x = mydict.get("123456")
print(x)

结果:

{'code;msg': [], '123456;Lorem ipsum dolor sit amet': [' consectetur adipiscing elit'], '345981;"sed do eiusmo ut labore': [' et dolore magna aliqua;"'], '459827;ullamco': [' laboris nisi ut aliquip ex ea commodo consequat.'], '490023;veniam': [' quis nostrud exercitation'], '345612;mollit anim id est laborum.': []}
None

我想搜索与每个键关联的值。

EG:当我写作时:

key= "123456"
value=mydict.get(key)
print(key + "has this value : " + value)

我会得到一个输出:

>>> The key 123456 has this value :Lorem ipsum dolor sit amet, consectetur adipiscing elit

【问题讨论】:

  • 你有什么问题?
  • 我已经描述了我想要输出的内容

标签: python csv dictionary


【解决方案1】:

无需任何导入,您可以使用:

with open('test.csv') as f:
    csv = f.readlines()

d = {}
for line in csv[1:]:  # Loop csv lines skipping first line csv[1:] (headers) 
    m = line.split()
    if len(m) > 1:
        d[m[0]] = " ".join(m[1:])
print(d)

输出:

{'123456': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit', '345981': 'sed do eiusmo ut labore, et dolore magna aliqua;', '459827': 'ullamco, laboris nisi ut aliquip ex ea commodo consequat.', '490023': 'veniam, quis nostrud exercitation', '345612': 'mollit anim id est laborum.'}

Python Demo


注意事项:

  1. 通过key搜索,我通常使用:

    if '123456' in d:
        print(d['123456'])
        # Lorem ipsum dolor sit amet, consectetur adipiscing elit
    
  2. 打印字典keysvalues

    print(d.keys(), d.values())
    # dict_keys(['123456', '345981', '459827', '490023', '345612'])
    # dict_values(['Lorem ipsum dolor sit amet, consectetur adipiscing elit', 'sed do eiusmo ut labore, et dolore magna  aliqua;', 'ullamco, laboris nisi ut aliquip ex ea commodo consequat.', 'veniam, quis nostrud exercitation', 'mollit anim id est laborum.'])
    

【讨论】:

    【解决方案2】:

    使用csv 模块。

    例如:

    import csv
    
    result = {}
    with open('test.csv') as infile:
        reader = csv.reader(infile, delimiter=';')
        next(reader)                          #Skip Header
        for row in reader:                    #Iterate Each Line
            result[row[0]] = row[1]           #Form Dictionary 
    print(result)
    

    输出:

    {'123456': 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
     '345612': 'mollit anim id est laborum.',
     '345981': 'sed do eiusmo ut labore, et dolore magna aliqua',
     '459827': 'ullamco, laboris nisi ut aliquip ex ea commodo consequat.',
     '490023': 'veniam, quis nostrud exercitation'}
    

    【讨论】:

      【解决方案3】:

      问题在于输入数据,该文件包含多个逗号,您正在使用 csv 阅读器阅读。第二列应该用双引号括起来。

      code,msg
      "123456","Lorem ipsum dolor sit amet, consectetur adipiscing elit"
      "345981","sed do eiusmo ut labore, et dolore magna aliqua;"
      "459827","ullamco, laboris nisi ut aliquip ex ea commodo consequat."
      "490023","veniam, quis nostrud exercitation"
      "345612","mollit anim id est laborum."
      

      修改数据后,如果你执行你的 sn-p 就可以正常工作了。

      {'code': ['msg'], '123456': ['Lorem ipsum dolor sit amet, consectetur adipiscing elit'], '345981': ['sed do eiusmo ut labore, et dolore magna aliqua;'], '459827': ['ullamco, laboris nisi ut aliquip ex ea commodo consequat.'], '490023': ['veniam, quis nostrud exercitation'], '345612': ['mollit anim id est laborum.']}
      ['Lorem ipsum dolor sit amet, consectetur adipiscing elit']
      

      下面是关于使用 pandas 的附加内容:

      你可以使用 pandas 中的 todic 方法,使用 pandas 读取 csv 文件,然后转换为 dataframe,然后执行下面的代码

      df.set_index('code').T.to_dict('list')
      

      完整代码:

      import pandas as pd
      
      df = pd.read_csv(filepath_or_buffer = CSV_FILE_PATH") 
      
      df.set_index('code').T.to_dict('list')
      

      输出:

      {123456: ['Lorem ipsum dolor sit amet, consectetur adipiscing elit'],
       345981: ['sed do eiusmo ut labore, et dolore magna aliqua;'],
       459827: ['ullamco, laboris nisi ut aliquip ex ea commodo consequat.'],
       490023: ['veniam, quis nostrud exercitation'],
       345612: ['mollit anim id est laborum.']}
      

      【讨论】:

      • 我在这个页面的任何地方都没有看到pandas#tag,你为什么要发布这个?
      猜你喜欢
      • 1970-01-01
      • 2021-03-27
      • 2015-08-21
      • 1970-01-01
      • 2012-11-19
      • 2020-10-14
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      相关资源
      最近更新 更多