python - 使用大型(1.7gig)csv 文件在 python 中进行数据清理

标签 python csv memory bigdata

我正在尝试使用 python 进行一些数据清理。我有一些大型 (1 - 2gigs) csv 文件,我想按某些属性(例如日期、时间)进行排序,然后使用此信息输出另一个 csv 文件目的是使其能够在excel中使用。

当我遍历行时​​,我遇到了一些大的内存问题。最初我使用的是 32 位 Idle,它无法运行我的代码,然后切换到 64 位 Spyder。现在代码运行,但在第一个迭代行停止(似乎正在处理,内存被消耗,但在过去的半小时内没有看到它继续移动)。

我的代码如下。该过程在第 10 行停止(突出显示)。我对 python 还很陌生,所以我确信我的代码非常原始,但这是我能做的最好的了!提前感谢您的帮助:)

def file_reader(filename):
    "function takes string of file name and returns a list of lists"
    global master_list
    with open(filename, 'rt') as csvfile:
        rows = []
        master_list = []
        rowreader = csv.reader(csvfile, delimiter=',', quotechar='|')
        **for row in rowreader:**
            rows.append(','.join(row))

        for i in rows:
            master_list.append(i.replace(' ', '').replace('/2013', ',').split(","))

        return master_list

def trip_dateroute(date,route):
    dateroute_list = []
    for i in master_list:
        if str(i[1]) == date and str(i[3]) == route:
            dateroute_list.append(i)
    return dateroute_list

def output_csv(filename, listname):
    with open(filename, "w") as csvfile:
        writer = csv.writer(csvfile, delimiter=',', quotechar='|', lineterminator='\n')
        for i in listname:
            writer.writerow(i)           

最佳答案

如果不需要将整个文件内容保存在内存中,则可以只处理每一行并立即将其写入输出文件。另外,在您的示例中,您解析 CSV,然后再次生成 CSV,但您似乎没有使用解析的数据。如果这是正确的,您可以简单地执行以下操作:

def file_converter(infilename, outfilename):
    with open(infilename, 'rt') as infile, open(outfilename, "w") as outfile:  
        for line in infile:
            line.replace(' ', '').replace('/2013', ',')
            outfile.write(line)

如果函数 trip_dateroute() 用于过滤实际应该写出的行,您也可以添加它,但实际上您必须解析 CSV:

def filter_row(row, date, route):
    return str(row[1]) == date and str(row[3]) == route

def cleanup(field):
    return field.replace(' ', '').replace('/2013', ',')

def file_converter(infilename, outfilename, date, route):
    with open(infilename, 'rt') as infile, open(outfilename, "w") as outfile:
        reader = csv.reader(infile, delimiter=',', quotechar='|')
        writer = csv.writer(outfile, delimiter=',', quotechar='|', lineterminator='\n')
        for row in reader:
            row = [cleanup(field) for field in row if filter_row(row, date, route)]
            writer.writerow(row)

关于python - 使用大型(1.7gig)csv 文件在 python 中进行数据清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37566586/

相关文章:

python - 您如何不自动取消引用 Google App Engine 中的 db.ReferenceProperty?

python - 将城市和温度值获取到变量中以在 reducer 文件中使用

mysql - 如何将 1 列文件的 CSV 导入到 2 列的数据库表?

php - ini_set ("memory_limit") 在 PHP 5.3.3 中根本不起作用

python - 从 python 中的现有列创建新列

azure - 将 'Set Variable' 事件的输出保存到 csv 文件中 [Azure 数据工厂]

c# - CSV 文件中的附加信息 : External table is not in the expected format.

C++ 内存 : deleting an unused array of bool can change the result from right to wrong

php - 在 Windows 上使用 PHP 获取总可用系统内存

python - 尽管调用了 show() ,但插入的选项卡未显示在 QTabWidget 中