【问题标题】:Creating a versatile data class in Python在 Python 中创建一个通用的数据类
【发布时间】:2018-05-09 14:16:18
【问题描述】:

我希望各位好心人能帮助我完成一个项目。本质上,我正在尝试创建一个将 CSV 文件作为输入的类,检查文件中的数据列数,并将该数据存储在字典中的键、值对中。到目前为止我的代码如下:

import csv

class DataStandard():
'''class to store and examine columnar data saved as a csv file'''

def __init__(self, file_name):
self.file_name = file_name

self.full_data_set = {}

with open(self.file_name) as f:
    reader = csv.reader(f)

    # get labels of each column in list format
    self.col_labels = next(reader)

    # find the number of columns of data in the file
    self.number_of_cols = len(self.col_labels)

    # initialize lists to store data using column label as key
    for label in self.col_labels:
        self.full_data_set[label] = []

我遇到困难的部分是一旦创建了字典 (full_data_set) 我不知道如何循环遍历 CSV 文件的其余部分并将数据存储在每个键的相应值中(列) .由于我必须循环遍历 csv.reader 对象,我到目前为止所尝试的一切都没有奏效。 我希望这个问题是有道理的,但请随时提出任何澄清问题。此外,如果您想到一种可能以更好的 Pythonic 方式工作的方法,我将不胜感激。这是我在课堂上的第一个自导项目之一,所以这个主题对我来说相当新。提前致谢!

【问题讨论】:

  • 使用for row in reader:
  • 你可以使用zip(self.col_labels, row)创建对(key,value),但是如果你有更多的行那么你应该创建list of dictionares
  • csv 模块有一个 DictReader 类。

标签: python loops csv dictionary


【解决方案1】:

这可能会为您提供解决方案的想法。假设标签只在第1行,其余为数据,则无数据时行长变为0:

import csv

class DataStandard():
'''class to store and examine columnar data saved as a csv file'''

def __init__(self, file_name):
self.file_name = file_name

self.full_data_set = {}

#modify method to the following:

with open(self.file_name) as f:
    reader = csv.reader(f)

    for row in reader:
        if row = 0:

            # get labels of each column in list format
            self.col_labels = next(reader)

            # find the number of columns of data in the file
            self.number_of_cols = len(self.col_labels)

            # initialize lists to store data using column label as key
            for label in self.col_labels:
                self.full_data_set[label] = []

        else:
            if len(row) != 0:
                for i in range(self.number_of_cols):
                    label = self.col_labels[i]
                    self.full_data_set[label] = next(reader)

...我的一个担忧是,虽然'with open(...)' 是有效的,但根据我的经验,可以忽略某些级别的缩进。在这种情况下,为了减少缩进的数量,我只需将 'row=0' 和 'row!=0' 操作分成不同的 'with open(...)' 实例,即执行第 1 行,关闭,再次打开,执行第 2 行。

【讨论】:

    【解决方案2】:

    要读取行,您可以使用for row in reader

    data = []
    
    with open('test.csv') as f:
        reader = csv.reader(f)
    
        headers = next(reader)
    
        for row in reader:
            d = dict(zip(headers, row))
            #print(d)
            data.append(d)
    
    print('data:', data)
    

    正如@PM2Ring csv 所说,有DictReader

    with open('test.csv') as f:
        reader = csv.DictReader(f)
        data = list(reader)
    
    print('data:', data)
    

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2021-08-29
      • 1970-01-01
      • 2021-07-26
      • 2021-01-14
      相关资源
      最近更新 更多