csv.DictReader是否将文件存储在内存中?

时间:2016-08-18 05:17:35

标签: python-2.7 csv dictionary in-memory

我必须在文件中读取几乎100K行的大型CSV文件,如果我能以字典格式读取每个文件行,也会更容易处理该文件。

经过一番研究后,我从csv模块中找到了python的内置函数csv.DictReader

但是在文档中还没有明确提到它是否将整个文件存储在内存中。

但它提到了:

  

fieldnames参数是一个序列,其元素按顺序与输入数据的字段相关联。

但我不确定序列是否存储在内存中。

所以问题是,它是否将整个文件存储在内存中?

如果是这样,是否还有其他选项可以将单行读作文件中的generaror表达式,并将get行读为dict。

这是我的代码:

def file_to_dictionary(self, file_path):
    """Read CSV rows as a dictionary """
    file_data_obj ={}
    try:
        self.log("Reading file: [{}]".format(file_path))
        if os.path.exists(file_path): 
            file_data_obj = csv.DictReader(open(file_path, 'rU'))
        else:
            self.log("File does not exist: {}".format(file_path))
    except Exception as e:
        self.log("Failed to read file.", e, True)
    return file_data_obj

1 个答案:

答案 0 :(得分:4)

据我所知,您创建的DictReader对象(在您的情况下为file_data_obj)是生成器类型对象。

生成器对象不存储在内存中,但只能迭代一次!

要以列表形式打印数据的字段名,您只需使用:print file_data_obj.fieldnames

其次,根据我的经验,我发现从csv文件读取数据时使用字典列表要容易得多,其中每个字典代表文件中的一行。请考虑以下事项:

def csv_to_dict_list(path):
    csv_in = open(path, 'rb')
    reader = csv.DictReader(csv_in, restkey=None, restval=None, dialect='excel')
    fields = reader.fieldnames
    list_out = [row for row in reader]
    return list_out, fields

使用上面的功能(或类似的东西),你可以用几行来实现你的目标。例如:

data, data_fields = csv_to_dict_list(path)
print data_fields  (prints fieldnames)
print data[0] (prints first row of data from file)

希望这有帮助! 路加