分割CSV时打开的输出文件过多

时间:2019-02-17 00:52:05

标签: python python-3.x

非常新手尝试使用python。

我尝试实施类似此问题Splitting csv file based on a particular column using Python

中讨论的内容

我的目标是获取一个包含1500万行的500个股票代码符号的文件,并将每个股票代码放入自己的文件中。

但是,当我运行它时,我得到了

OSError:[Errno 24]打开的文件太多:“ APH.csv”

所有数据行都是按顺序排列的(即股票代码“ A”的所有数据行都是一个接一个,所以我可以在继续下一个文件之前关闭文件)。我不确定在进入下一个代码之前,我将在此代码中关闭文件的位置。仅供参考-如果有问题,请在Mac上使用。

我的代码是

import csv

with open('WIKI_PRICES_big.csv') as fin:    
    csvin = csv.DictReader(fin)
    # Category -> open file lookup
    outputs = {}
    for row in csvin:
        cat = row['ticker']
        # Open a new file and write the header
        if cat not in outputs:
            fout = open('{}.csv'.format(cat), 'w')
            dw = csv.DictWriter(fout, fieldnames=csvin.fieldnames)
            dw.writeheader()
            outputs[cat] = fout, dw
        # Always write the row
        outputs[cat][1].writerow(row)
    # Close all the files
    for fout, _ in outputs.values():
        fout.close()

1 个答案:

答案 0 :(得分:0)

根据您描述的文件结构,应执行以下操作。

诀窍在于,如果报价值始终是按顺序排列的,则您只需要一次保持打开一个文件输出文件的状态。然后,您可以关闭旧的报价单,然后在遇到新的报价值时重新打开新的报价单。

import csv

fout = False
with open('WIKI_PRICES_big.csv') as fin:    
    csvin = csv.DictReader(fin)
    seen = []

    for row in csvin:
        cat = row['ticker']

        # Open a new file and write the header.
        if cat not in seen:
            seen.append(cat)

            if fout:  # Close old file if we have one.
                fout.close()

            fout = open('{}.csv'.format(cat), 'w')
            dw = csv.DictWriter(fout, fieldnames=csvin.fieldnames)
            dw.writeheader()

        # Always write the row
        dw.writerow(row)

    fout.close()