• 【python】批量分类数据


    直接使用open一行一行写入文件

    1,批量读取一个文件夹内的文件
    存在大量的出租车id,直接使用列表查询,速度慢有可能内存溢出。需要使用数据库查询。

    2,读取每一行数据,在数据库中查询id
    如果,id不在数据库中,将id插入数据库,以id为文件名建立txt文件,将该行数据写入txt文件
    如果,id在数据库中,将该行数据写入对应的txt文件
    一行一行地读取和识别数据会造成时间开销加大

    # -*- coding: utf-8 -*-
    """
    Created on Mon Aug  8 21:49:54 2022
    
    @author: xza
    """
    import sqlite3
    from sqlite3 import Error
    import os
    path="D:\\20200123"
    out_path="D:\\out"
    
    #建立数据库
    def sql_connection():
        try:
            con = sqlite3.connect('mydatabase.db')
            return con
        except Error:
            print(Error)
    
    #创建表格
    def sql_table(con):
        cursorObj = con.cursor()
        cursorObj.execute("CREATE TABLE Car(id integer PRIMARY KEY,userid text)")
        con.commit()
    
    #插入数据
    def sql_insert(con, Car):
        cursorObj = con.cursor()
        cursorObj.execute('INSERT INTO Car(id, userid) VALUES(?, ?)', Car)
        con.commit()
    
    #建立数据库和表格
    con = sql_connection()
    sql_table(con)
    con.close()
    # 获得所有文件名列表
    fileList = os.listdir(path)
    N=1
    for file in fileList:
        #建立数据库和表格
        con = sql_connection()
        lines=open(path+'\\'+file)
        for line in lines:
            userid=line.split(',')[3]
            # 查询到数据
            cur = con.execute("select 1 from Car where userid  = \""+userid+"\" limit 1")
            values = cur.fetchall()
            cur.close()
            #判断数据是否查到
            if len(values)==0:
                #插入数据
                Car = (N,userid)
                sql_insert(con, Car)
                #创建并写入文件
                fo = open(out_path+"\\"+userid+'.csv','w',encoding ='utf-8')
                fo.writelines(line+'\n')
                fo.close()
                N=N+1
            else:
                #创建并写入文件
                fo = open(out_path+"\\"+userid+'.csv','a+',encoding ='utf-8')
                fo.writelines(line+'\n')
        con.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    使用pandas库执行

    可以使用pandas之间对整个文件进行分类,然后使用追加模式写入数据,该模式下,没有csv会自动生成csv文件,已存在csv文件则在文件最后追加数据。不需要再额外查询是否存在;大大加快了处理速度

    import pandas as pd
    import os
    path="D:\\20200123"
    out_path="D:\\out"
    # 获得所有文件名列表
    fileList = os.listdir(path)
    for file in fileList:
        df = pd.read_csv(path+'\\'+file,header=None,names=['年月日','时分秒','公司','车ID','经度','纬度','速度','方向角','空重状态','设备状态','接收时间'])
        DataList = list(df.groupby(['车ID']))
        for IN_DATA in DataList:
            IN_DATA[1].to_csv(out_path+"\\"+ IN_DATA[0]+ '.csv',mode='a',index=False,header=False)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    七天.NET 8操作SQLite入门到实战 - SQLite 简介
    敏捷组织 | 企业克服数字化浪潮冲击的路径
    Centos下编译ffmpeg动态库
    手写文字识别易语言代码
    windows编程-线程
    Spring Security限制登录尝试示例
    ArkTS开发实践
    总结数据结构-1
    【luogu P3295】萌萌哒(并查集)(倍增)
    【Java 进阶篇】用JSTL玩转Java:了解JSTL常用标签
  • 原文地址:https://blog.csdn.net/xza13155/article/details/126237698