从一个2GB的.csv文件中提取json中的值的最佳方法

10 浏览
0 Comments

从一个2GB的.csv文件中提取json中的值的最佳方法

我目前正在尝试在Python 2.7中读取包含最多1百万行和200列的.csv文件(文件大小范围从100mb到1.6gb)。对于行数少于300,000的文件,我可以做到(速度很慢),但一旦超过这个数量,就会出现内存错误。我的代码如下:

def getdata(filename, criteria):
    data=[]
    for criterion in criteria:
        data.append(getstuff(filename, criteron))
    return data
def getstuff(filename, criterion):
    import csv
    data=[]
    with open(filename, "rb") as csvfile:
        datareader=csv.reader(csvfile)
        for row in datareader: 
            if row[3]=="column header":
                data.append(row)
            elif len(data)<2 and row[3]!=criterion:
                pass
            elif row[3]==criterion:
                data.append(row)
            else:
                return data

在getstuff函数中使用else子句的原因是所有符合条件的元素将在csv文件中一起列出,所以当我超过它们时,为了节省时间,我离开循环。

我的问题是:

  1. 如何能够使它在更大的文件中正常工作?
  2. 有没有办法让它运行得更快?

我的计算机有8GB RAM,运行64位Windows 7,处理器是3.40 GHz(不确定你需要什么信息)。

0
0 Comments

问题的原因是处理大型数据集时内存耗尽的问题。虽然使用pandas.read_csv()函数可以显著提高读取速度,但仍然需要将整个文件读取到内存中,这会导致内存不足的问题。

解决方法是使用流处理器而不是将文件读取到列表中。流处理器可以逐行读取文件,而不会将整个文件加载到内存中。这样可以节省内存,并且在处理大型数据集时更加高效。

以下是使用流处理器从json中提取值的最佳方法:

import json
import csv
# 打开csv文件
with open('data.csv', 'r') as csvfile:
    # 创建csv读取器
    reader = csv.reader(csvfile)
    
    # 遍历每一行数据
    for row in reader:
        # 将json字符串转换为字典
        data = json.loads(row[0])
        
        # 从字典中提取值
        value = data['key']
        
        # 打印提取的值
        print(value)

通过逐行读取csv文件并将每行数据解析为json字典,我们可以轻松地从json中提取所需的值。这种方法可以避免将整个文件加载到内存中,因此适用于处理大型数据集。

总结起来,处理大型数据集时,使用流处理器而不是将整个文件读取到内存中是提取json值的最佳方法。这种方法可以避免内存耗尽的问题,并且在处理大型数据集时更加高效。

0
0 Comments

问题的出现原因:

问题的出现是因为有人想要从一个2GB的.csv文件中提取出一个json中的值。使用pandas库可以更直观地处理大型csv文件,但对于初学者来说,让他们安装pandas库可能是一个错误。

解决方法:

下面的代码是使用pandas库处理大型csv文件的一种解决方法:

import pandas as pd
chunksize = 10 ** 8
for chunk in pd.read_csv(filename, chunksize=chunksize):
    process(chunk)

这段代码将文件分成了多个块(chunk),每次处理一个块。这样可以避免一次性加载整个csv文件到内存中,从而减少内存的使用。

虽然有人认为使用pandas库更直观,但也有人认为让初学者安装pandas库是一个错误。因为Python的库管理比较混乱,而且Python自带的csv模块已经足够满足需求。

某些情况下使用pandas库进行数据准备和分析非常常见,特别是在加载csv文件的情况下。还某些情况下可以使用'chunksize'和'usecols'参数来控制加载的数据量。

另外,有人问到代码中的process()函数是在哪个包中,回答是这里只是举例,表示可以在这个函数中进行一些操作。

0
0 Comments

问题的原因是读取整个csv文件的行并将其存储在一个列表中进行处理。解决方法是在生成行的同时进行处理,并使用生成器函数来筛选数据。

首先,可以使用生成器函数来筛选数据。这个函数的作用是根据给定的条件筛选出符合条件的行。函数首先读取csv文件的头行,然后逐行读取文件,并根据条件筛选出符合条件的行。当读取到一系列连续的行后,函数停止读取并返回结果。

第二个解决方法是使用itertools库中的dropwhile和takewhile函数来筛选数据。这个方法与第一个方法类似,但使用了更为简洁的代码。

接下来,可以将getstuff函数嵌套在getdata函数中,以便根据多个条件来筛选数据。getdata函数循环遍历给定的条件列表,并调用getstuff函数来获取符合条件的行。

最后,在代码中直接循环遍历getdata函数返回的生成器对象,并逐行处理数据。

通过以上的优化方法,可以将内存占用减少到只存储一行数据,而不是存储整个csv文件的行。这样可以提高处理大型csv文件的效率。

至于“what do you think what it is??”这个问题,答案取决于csv文件中第四列的内容。这个问题暗示了在根据条件筛选数据时,需要根据具体情况确定要搜索的内容。

0