我必须在文件中读取几乎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
答案 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)
希望这有帮助! 路加