【问题标题】:How do I add a csv file to a dictionary as a value如何将 csv 文件作为值添加到字典中
【发布时间】:2021-01-12 14:15:38
【问题描述】:

我创建了一个字典 dataset = dict() 并创建了一个列表列:

colums = ["date", "day", "month", "year", "cases", "deaths", "countriesAndTerritories","countryTerritoryId", "countryTerritoryCode", "population2019", "continent", "cumulativeper1000002Weeks"]

现在我将列作为键,我想要一个 csv 文件作为值。 这是代码:

dataset = dict()
for h in colums:
    dataset[h] = ""
print(dataset)

结果:

{'date': '', 'day': '', 'month': '', 'year': '', 'cases': '', 'deaths': '', 'countriesAndTerritories': '', 'countryTerritoryId': '', 'countryTerritoryCode': '', 'population2019': '', 'continent': '', 'cumulativeper1000002Weeks': ''}

但是我想将一个 csv 文件作为值放入字典中

for row in reader:
    dataset[h] = row
print(dataset)

给了

{'date': '', 'day': '', 'month': '', 'year': '', 'cases': '', 'deaths': '', 'countriesAndTerritories': '', 'countryTerritoryId': '', 'countryTerritoryCode': '', 'population2019': '', 'continent': '', 'cumulativeper1000002Weeks': ['25/09/2020', '25', '9', '2020', '0', '0', 'Afghanistan', 'AF', 'AFG', '38041757', 'Asia', '1.57195684']}

我想要发生的是{'date': '25/09/2020', 'day': '25', 'month': '9' ...... }

注意:代码是

import csv
def read_dataset() -> List[Dict[str,str]]:
    with open('covid-19.csv', 'r') as file:
        reader = csv.reader(file)
        no_head = next(reader, None)
        colums = ["date", "day", "month", "year", "cases", "deaths", "countriesAndTerritories",
              "countryTerritoryId", "countryTerritoryCode", "population2019", "continent", "cumulativeper1000002Weeks"]
        dataset = dict()
        for h in colums:
            dataset[h] = ""
        for row in reader:
            dataset[h] = row
            return dataset
dataset = read_dataset()
print(dataset)

【问题讨论】:

    标签: python list csv dictionary


    【解决方案1】:

    针对您的案例的三行代码(需要python -m pip install requests),生成字典列表,每个字典都是您想要的形式的一行:

    Try it online!

    import io, csv, requests
    bytes_data = requests.get('https://opendata.ecdc.europa.eu/covid19/casedistribution/csv').content
    print(list(csv.DictReader(io.StringIO(bytes_data.decode('utf-8')), delimiter = ',')))
    

    【讨论】:

      【解决方案2】:

      从您发布的代码中,您的文件看起来如何并不清楚。 假设它只有一行,比如

      '25/09/2020','25','9','2020','0','0','Afghanistan','AF','AFG','38041757','Asia','1.57195684'
      

      你可以这样做

      colums = ["date", "day", "month", "year", "cases", "deaths", "countriesAndTerritories", "countryTerritoryId", "countryTerritoryCode", "population2019", "continent", "cumulativeper1000002Weeks"]
      
      with open('untitled.txt', 'r') as file:
          fcontent = file.read().split(',')
      
      for idx, c in enumerate(colums):
          dataset[c] = fcontent[idx]
      

      【讨论】:

      • 我从data.europa.eu/euodp/nl/data/dataset/covid-19-coronavirus-data 得到了文件,它有很多行。谢谢你的回复,我试试看
      • @Bows 我没有查看您的文件,但您可能想编辑您的问题并发布其中的一部分,例如前 10 行。无论如何,我建议使用pandas,因为您似乎使用时间序列数据。
      【解决方案3】:

      我建议查看 Python csv 模块中的 DictReader。我认为通过自动执行您需要的操作可以为您省去很多麻烦。

      我怀疑你的代码可以重写为:

      import csv
      from typing import Dict, List, Iterable
      
      
      def read_dataset(filename: str, custom_headers: Iterable[str] = None) -> List[Dict[str, str]]:
          with open(filename, 'r') as file:
              reader = csv.DictReader(file, fieldnames=custom_headers)
              return list(reader)
      
      my_headers = [
          'date',
          'day',
          'month',
          'year',
          'cases',
          'deaths',
          'countriesAndTerritories',
          'countryTerritoryId',
          'countryTerritoryCode',
          'population2019',
          'continent',
          'cumulativeper1000002Weeks',
      ]
      
      dataset = read_dataset('covid-19.csv', my_headers)
      print(dataset)
      

      免责声明:我没有尝试运行上述代码。

      这假设您正在阅读的 csv 文件还没有标题行,或者您想用自定义名称重命名字段。

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多