python遍历文件夹下的csv文件,读取文件内容存到数据库_python循环一个文件中的每个csv,并进行数据处理-程序员宅基地

技术标签: python  

一、使用python导入的原因

1、csv文件为从文件数据库导出的数据文件,一个一个的导入到数据库效率就比较低下;

2、日期形式的字段会存在特殊的字符或者字段中包含了单引号就会报错。

二、操作

1、循环读取选定文件夹下的文件

'''
    读取文件夹下的csv文件
'''
def readAllFiles(filePath):
    fileList = os.listdir(filePath)
    for file in fileList:
        path = os.path.join(filePath, file)
        if os.path.isfile(path):
            file = open(path, 'r', encoding='utf-8')
            print(path)
            #流程记录信息
            if path.find("workflow") != -1:
                analysisWorkflowCsv(file)
                pass
            #意见信息
            elif path.find("opinion") != -1:
                analysisOpinionCsv(file)
                pass
            #发文数据
            elif path.find("wd_24") != -1:
                analysisWd24Csv(file)
                pass
            #收文数据
            elif path.find("wd_25") != -1:
                analysisWd25Csv(file)
                pass
        else:
            readAllFiles(path)

2、解析文件内容,首行为标题栏需要跳过。入库操作每满1000条commit一次主要是python频繁提交执行次数达到1000+就会报错。1000条commit一次可以避免错误并缓解内存压力。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def analysisWorkflowCsv(file):
    csvFile = csv.reader(file)
    # 读取一行,下面的reader中已经没有该行了
    head_row = next(csvFile)
    # print(head_row)
    __conn = getConnect_old()
    counter = 0
    for row in csvFile:
        workflow = {
    }
        workflow['UUID'] = row[0]
        workflow['subject'] = row[1]
        workflow['signdate'] = row[2]
        workflow['U_UnitName'] = row[3]
        workflow['U_UnitUser'] = row[4]
        workflow['U_UnitUserTitle'] = row[5]
        workflow['U_UnitEndTime'] = row[6]
        workflow['U_UnitAction'] = row[7]
        workflow['U_UnitToTitle'] = row[8]
        if insertWorkflows(__conn, workflow):
            counter += 1
        if counter % 1000 == 0:
            __conn.commitData()
    print("已经插入工作流数据: %d 条。"%counter)
    __conn.commitData()
    __conn.closeConn()

2、解析文件内容,首行为标题栏需要跳过。入库操作每满1000条commit一次主要是python频繁提交执行次数达到1000+就会报错。1000条commit一次可以避免错误并缓解内存压力。

'''
    解析文件
'''
def analysisWorkflowCsv(file):
    csvFile = csv.reader(file)
    # 读取一行,下面的reader中已经没有该行了
    head_row = next(csvFile)
    # print(head_row)
    __conn = getConnect_old()
    counter = 0
    for row in csvFile:
        workflow = {
    }
        workflow['UUID'] = row[0]
        workflow['subject'] = row[1]
        workflow['signdate'] = row[2]
        workflow['U_UnitName'] = row[3]
        workflow['U_UnitUser'] = row[4]
        workflow['U_UnitUserTitle'] = row[5]
        workflow['U_UnitEndTime'] = row[6]
        workflow['U_UnitAction'] = row[7]
        workflow['U_UnitToTitle'] = row[8]
        if insertWorkflows(__conn, workflow):
            counter += 1
        if counter % 1000 == 0:
            __conn.commitData()
    print("已经插入工作流数据: %d 条。"%counter)
    __conn.commitData()
    __conn.closeConn()

3、数据入库

'''
    插入工作流程数据
'''
def insertWorkflows(__conn, workflow):
    __sql = '''
        INSERT INTO workflows (
            UUID, U_UnitName, U_UnitUser, U_UnitUserTitle, U_UnitEndTime, U_UnitAction, U_UnitToTitle, subject, signdate
        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
    '''
    __params = (
        workflow['UUID'], workflow['U_UnitName'], workflow['U_UnitUser'], workflow['U_UnitUserTitle'],
        workflow['U_UnitEndTime'], workflow['U_UnitAction'], workflow['U_UnitToTitle'], workflow['subject'],
        workflow['signdate']
        )
    # print(__sql % __params)
    return __conn.mssql_exe_sql(__sql, __params)

4、python操作sqlserver代码

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import pymssql

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

'''
数据库连接
'''
class ConnectionDatabase(object):
    # 连接mysql数据库
    def __init__(self, ip, user_name, passwd, db, char='utf8'):
        self.ip = ip
        # self.port = port
        self.username = user_name
        self.passwd = passwd
        self.mysqldb = db
        self.char = char

        self.MsSQL_db = pymssql.connect(
            host=self.ip,
            user=self.username,
            password=self.passwd,
            database=self.mysqldb,
            charset=self.char)
  # 查询数据(sqlserver)
    def mssql_findList(self, sql):
        cursor = self.MsSQL_db.cursor()
        MsSQL_sql = sql
        results = None
        if not cursor:
            raise (NameError,"数据库连接失败")
        try:
            # 执行SQL语句
            cursor.execute(MsSQL_sql)
            # 获取所有记录列表
            results = cursor.fetchall()
        except Exception as e:
            print(e)
            self.MsSQL_db.close()
        if results:
            return results
        else:
            return None

    # 数据增删改查(sqlserver)
    def mssql_exe_sql(self, sql, params):
        cursor = self.MsSQL_db.cursor()
        MsSQL_sql = sql
        result = 0
        if not cursor:
            raise (NameError,"数据库连接失败")
        try:
            # 执行SQL语句
            cursor.execute(MsSQL_sql, params)
            result = cursor.rowcount
        except Exception as e:
            print(e)
            self.MsSQL_db.rollback()
            self.MsSQL_db.close()

        return result>0

    '''
        提交数据集
    '''
    def commitData(self):
        try:
            self.MsSQL_db.commit()
        except Exception as e:
            print(e)

    '''
        关闭数据库连接
    '''
    def closeConn(self):
        if self.MsSQL_db:
            self.MsSQL_db.close()

5、执行代码

if __name__ == "__main__":
    #文件所在的文件夹父路径
    # testFilePath = "G:\数据解析\csv\workflowcsv"
    testFilePath = "G:\数据解析\csv\wd25csv"
    readAllFiles(testFilePath)

遇到的问题及解决方式:

(1)以上代码执行时如果有时间类型的字段需要对字符串进行转换;

re.sub('[^0-9 | \- | : ]', '', timestr) 

利用正则表达式将时间字符串中的特殊字符去掉,再转换为时间字符串,避免代码执行时类型转换错误。

(2)数据库插入数据的sql语句最好使用的是带参数的执行方式,不要使用sql占位符拼接的方式,这样可能出现单引号“’”导致sql执行失败。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_38682860/article/details/112877677

智能推荐

全角半角互相转换_r如何切换全角半角-程序员宅基地

文章浏览阅读185次。【代码】全角半角互相转换。_r如何切换全角半角

02架构管理之研发管理-程序员宅基地

文章浏览阅读178次。研发管理(Research and Development Management,R&D Management)是一种系统性的管理活动,是以产品开发流程为基础的项目管理体系,旨在规划、组织、协调和监督研发项目,对研发项目的人员、计划、质量、成本等进行综合管理,从而打造高效能的研发团队,更好更快地实现项目目标。研发管理的本质是从流程化,标准化,制度化等维度建立管理机制。最终的核心目标是通过管理的法治建立标准化的操作规范,再通过标准化的规范提升人员的协作效率、监督机制、系统稳定性/安全性等。

磁盘访问性能分析及RAID简介_吞吐量和raid关系-程序员宅基地

文章浏览阅读1.3k次。简要介绍了磁盘访问性能相关指标,CPU的交互方式,和RAID_吞吐量和raid关系

塑胶模具报价计算原理方法与程序-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏4次。塑胶类产品的生产依赖于模具(Tooling),曾经为公司做过一个塑胶模具的报价系统。模具的成本,与ERP中的产品成本原理相似,材料费,人工费和制造费用,再加上企业利润,构成基本的价格。 常用的公式如下所示 模具价格=模具材料费+模具加工费+税金+利润 其中材料费占20%~30%,加工费50%~60%;一般模具利润率10%~30%,大型模具利润率20%~35% 模具时间与成本的关系如下 ..._塑胶模报价计算公式

logging模块使用_logging模块ch在生产可以打开吗-程序员宅基地

文章浏览阅读159次。最详细的还是 官方文档最简单的使用# -*- coding:utf-8 -*-import logginglogging.debug('debug message')logging.info('info message')logging.warn('warn message')logging.error('error message')logging.critical('crit..._logging模块ch在生产可以打开吗

千峰web前端入门html+css笔记(一)_千峰web前端开发-程序员宅基地

文章浏览阅读933次。标题描述_千峰web前端开发

随便推点

react 里面的东西居中_react图片居中-程序员宅基地

文章浏览阅读437次。react 里面的东西居中。_react图片居中

zookeeper_zookeeper访问地址-程序员宅基地

文章浏览阅读5.2k次。1.linux下安装完zookeeper之后,进入conf目录编辑zoo.cfg文件,找到dataDir属性更改其路径为zookeeper目录下的zkData文件夹.(因为其默认的目录在Linux下会定清理)(1)进入到zookeeper目录下的bin目录启动zookeeper,使用sh zkServer.sh命令启动zookeeper(或者zkServer.sh start命令启动).(2) 继续在bin目录下使用sh zkCli.sh命令启动zoo..._zookeeper访问地址

windows以G为单位整数分区公式(精准)_win7分盘100g公式-程序员宅基地

文章浏览阅读572次。下面是js的脚本,100G为例:// JS var num = 100Math.ceil(Math.ceil(num*1024/7.84423828125)*7.84423828125)使用方法,只要有浏览器就行,打开浏览器进入开发者模式F12,选择控制台将上面的代码粘贴到控制台中,红字部分为100G应分配的M数.如需其它容量大小自行修改100为对应的值..._win7分盘100g公式

新书推荐|Windows黑客编程技术详解-程序员宅基地

文章浏览阅读70次。《Windows黑客编程技术详解》面向对计算机系统安全开发感兴趣,或者希望提升安全开发水平的读者,以及从事恶意代码分析研究的安全人员。理论技术与实战操作相辅相成,凸显“道与术”庖丁解牛式剖析Windows用户层和内核层黑客技术原理代码兼容性高,支持Windows 7到Windows 10全平台系统近年来,全球大规模爆发勒索病毒和挖..._demongan

【UE4】制作加载图片Splash_ue4 splash image-程序员宅基地

文章浏览阅读5.2k次,点赞7次,收藏18次。很多小伙伴都会有疑惑,有的大神可以有自己独特的加载界面,其实这个编辑过程很简单,今天带大家来一起Try一Try! 长话短说,如果我们不做改变,每一个编辑器加载时的界面都是一样的,那我们怎么样去根据自己的喜好来改变这个logo呢?1.打开虚幻编辑器,项目设置2.项目设置中找到这个更改界面,然后把鼠标放在logo上,我们可以看到这个图片是虚幻自带的文件中原本就默认存在的,那我们就..._ue4 splash image

Acwing算法提高课_acwing提高课-程序员宅基地

文章浏览阅读154次。90%的dp问题都能转化为最短路问题,拓扑图可以转化为dp问题。记住模型,到相似题目就会有更清晰的思路,不会到无从下手。_acwing提高课