使用python将巨大的.csv文件快速拆分到磁盘上

使用python将巨大的.csv文件快速拆分到磁盘上,python,csv,bigdata,Python,Csv,Bigdata,我有一个大约100GB的.csv文件,我想用Python3.5.4将其拆分为1GB文件(请注意:) 我已经在下面编写了函数split\u csv('filename.csv') 我的问题是我怎样才能使它更快。这是必要的,因为我将定期拆分巨大的.csv文件的新版本 注释(包含编辑): 我想在磁盘上做。它不能装入RAM中 1GB.csv文件应该在行结束的地方分割。因此,它们将“大约”1GB。不完全是 导入操作系统 作为pd进口熊猫 导入csv 导入时间 def split_csv(文件,文件大小=

我有一个大约100GB的.csv文件,我想用Python3.5.4将其拆分为1GB文件(请注意:)

我已经在下面编写了函数
split\u csv('filename.csv')

我的问题是我怎样才能使它更快。这是必要的,因为我将定期拆分巨大的.csv文件的新版本

注释(包含编辑):

  • 我想在磁盘上做。它不能装入RAM中
  • 1GB.csv文件应该在行结束的地方分割。因此,它们将“大约”1GB。不完全是

    导入操作系统 作为pd进口熊猫 导入csv 导入时间

    def split_csv(文件,文件大小=1000,标题=T'): 开始=时间。时间()

使用
文件。读取(大小)
将从文件中读取
大小
字节

使用
file.readline()
将只从文件中读取一行,而不加载整个文件

如果您只想创建1GB块,那么使用第一个块


如果要创建大约1GB大小的.csv文件,请使用第二个文件,并在每次写入时计算输出文件的大小。

这样做的速度太快了。这里的瓶颈是I/O速度限制。说得好。我需要每个csv文件在记录行结束的地方结束。所以,“大约”1GB。file.readline()会比我在代码示例中使用的读取器更快吗?OP(正确)表示他们希望在有效点(行尾)拆分CSV文件。没有理由建议使用
read
,因为这很可能会使文件无效。
with open(file, 'r', encoding='utf8', newline='') as infile:
    datareader = csv.reader(infile)

    outfile_iterator=100001
    outfilename = file.split('.')[0]
    outfilename = outfilename+'_'+str(outfile_iterator)+'.csv'
    o = open(outfilename, 'w',newline='')
    outfile = csv.writer(o, delimiter=',', lineterminator="\r\n")
    print('writing to ',outfilename)

    total_row_count=0
    row_count = 0
    for row in datareader:
        if header=='T' and total_row_count==0:
            header_row=row
            print('header: ',header_row)
        outfile.writerow(row)
        row_count = row_count + 1
        total_row_count=total_row_count+1
        if os.stat(outfilename).st_size > (filesize*1048576) :
            print('rowcount: ',row_count)
            row_count = 0
            o.close()
            outfile_iterator = outfile_iterator + 1
            outfilename = file.split('.')[0]
            outfilename = outfilename+'_'+str(outfile_iterator)+'.csv'
            o = open(outfilename, 'w',newline='')
            outfile = csv.writer(o, delimiter=',', lineterminator="\r\n")
            print('writing to ',outfilename)
            if header=='T':
                outfile.writerow(header_row)
                print('header: ',header_row)

print('rowcount: ',row_count)
infile.close()
o.close()

elapsed = (time.time() - start)
print(elapsed, " seconds")