aiofiles拆分大文件

摘要:
importasyncioimportiofilesporttimeimportcsvimportosasyncdefmain(out_path,infile,num=10000):“”:paramout_path:输出文件路径:paraminfile:输入文件:paramnum:要拆分的每个文件的大小:return:“”asyncwithiofiles.open(infile,“r”
import asyncio
import aiofiles
import time
import csv
import os



async def main(out_path, infile, num=1000000):
    """
        :param out_path: 输出文件路径
        :param infile: 输入文件
        :param num: 拆分每个文件的大小
        :return:
        """
    async with aiofiles.open(infile, "r", encoding="utf-8") as fp:
        basename = os.path.basename(infile).split('.')[0]
        start = time.time()
        contents = await fp.readlines()
        count = 0
        csv_list = []

        for line in contents:
            if count == 0:
                head = line
            if count % num == 0 and csv_list:
                file_idx = int(count / num)
                file = f"{out_path}/{basename}_{file_idx}.csv"
                print(len(csv_list))
                if file_idx == 1:
                    async with aiofiles.open(file, "w", encoding="utf-8") as fw:
                        await fw.writelines(csv_list)
                else:
                    async with aiofiles.open(file, "w+", encoding="utf-8") as fw:
                        await fw.write(head)
                        await fw.writelines(csv_list)
                csv_list = []

            csv_list.append(line)

            count += 1
        if csv_list:
            print(len(csv_list))
            file = f"{out_path}/{basename}_{file_idx + 1}.csv"
            async with aiofiles.open(file, "w", encoding="utf-8") as w:
                await w.write(head)
                await w.writelines(csv_list)
        print(f"end1 {time.time() - start}")
        print(count)


def read_csv_sync(out_path, infile, num=1000000):
    """
    :param out_path: 输出文件路径
    :param infile: 输入文件
    :param num: 拆分每个文件的大小
    :return:
    """
    basename = os.path.basename(infile).split('.')[0]
    start = time.time()
    with open(infile, newline='', encoding='utf-8') as f:
        reader = csv.DictReader(e.replace('\0', '') for e in f)
        h = reader.fieldnames
        count = 0
        res_lst = []
        for r in reader:
            if count % num == 0 and res_lst:
                file_idx = int(count / num)
                file = f"{out_path}/{basename}_{file_idx}.csv"
                with open(file, newline='', encoding='utf-8') as fw:
                    write = csv.DictWriter(fw, h)
                    write.writerows(res_lst)
                res_lst = []
        if res_lst:
            print(len(res_lst))
            file = f"{out_path}/{basename}_{file_idx + 1}.csv"
            with open(file, newline='', encoding='utf-8') as w:
                write = csv.DictWriter(w, h)
                write.writerows(res_lst)

        print(f"end2 {time.time() - start}")




if __name__ == '__main__':
    o_path = r'D:\常用保存文件\split'
    o_path2 = r'D:\常用保存文件\split2'
    in_file = r'D:\临时文件\test.csv'
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(o_path, in_file))
    loop.close()
    read_csv_sync(o_path2, in_file)





 

测试文件 3852733 使用异步拆分时间对比

    1000000
 1000000
 1000000
 852733
 end1 5.248189210891724
 3852733
 end2 9.213284492492676

  

免责声明:文章转载自《aiofiles拆分大文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一种基于Python Pika库的RabbitMQ Client简单封装Dynamixel数字伺服舵机XM430-W350-R下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

excel表 更改后缀名 xlsx转成csv csv转换xlsx

excel 转成CSV 步骤: 1、打开你需要转换的Excel表格。这里特别介绍一下多个数字的现象,我们知道,像身份证这些多位数字,在正常表格里都是会加上一个‘来使其显示的,或者换成“文本”模式的单元格形式:这里分别以文本形式以及加‘的数字形式,为大家讲解转换成CSV格式后的效果差别。 2、先看以文本形式保存的表格转换: 2.1然后,就可以点击左上角的o...

CDH5.4.5运行Phoenix导入CSV文件

1.安装phoenix 在界面上设置Phoenix的parcel包: http://52.11.56.155:7180/cmf/settings?groupKey=config.scm.parcel.display_group&groupParent= 添加一个Remote Parcel Repository URLsurl:http://arch...

nmon:linux性能监控工具

nmon开源性能监控工具,用于监控linux系统的资源消耗信息,并能把结果输出到文件中,然后通过nmon_analyser工具产生数据文件与图形化结果。 一、安装软件 下载nmon安装包:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download选择适合自己系统的版本centos7_x86_64适合的最新...

导出CSV 换行问题。

程序方面: 1.Windows 中的换行符" " 2.Unix/Linux 平台换行符是 " "。 3.MessageBox.Show() 的换行符为 " " 4.Console 的换行符为 " " 为保持平台的通用性,可以用系统默认换行符 System.Environment.NewLine。 sql server:换行 select subscribe...

R语言学习——R读取txt、csv、xls和xlsx格式文件

最近项目中运用到了R读取文件数据,所以把相关好用的、经过验证的方法总结了一下,有效避免下次入坑。 1. R读取txt文件 使用R读取txt文件直接使用read.table()方法进行读取即可,不需要加载额外的包。 read.table("/home/slave/test.txt",header=T,na.strings = c("NA")) 1 注意,此处...

matlab读取csv文件数据并绘图

circle.m(画二维圆的函数) %该函数是画二维圆圈,输入圆心坐标和半径%rectangle()函数参数‘linewidth’修饰曲线的宽度%'edgecolor','r',edgecolor表示边框颜色,r表示颜色参数%'facecolor','b',facecolor表示内部填充颜色,b表示颜色参数function [] = circle( x,y...