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()
可以使用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)