Python常用模块11-python的csv模块

一.CSV模块介绍

CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。在 RFC 4180规范推出的很多年前,CSV 格式就已经被开始使用了,由于当时并没有合理的标准,不同应用程序读写的数据会存在细微的差别。这种差别让处理多个来源的 CSV 文件变得困难。但尽管分隔符会变化,此类文件的大致格式是相似的,所以编写一个单独的模块以高效处理此类数据,将程序员从读写数据的繁琐细节中解放出来是有可能的。

csv模块定义的函数:

函数名 函数用途
csv.reader(csvfile, dialect='excel', **fmtparams) 返回一个 reader 对象,该对象将逐行遍历 csvfile
csv.writer(csvfile, dialect='excel', **fmtparams) 返回一个 writer 对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串
csv.register_dialect(name[, dialect[, **fmtparams]]) 将 name 与 dialect 关联起来。name 必须是字符串。
csv.unregister_dialect(name) 从变种注册表中删除 name 对应的变种。
csv.get_dialect(name) 返回 name 对应的变种。
csv.list_dialects() 返回所有已注册变种的名称
csv.field_size_limit([new_limit]) 返回解析器当前允许的最大字段大小

csv模块定义的类:

类名 类描述
class csv.DictReader 创建一个对象,其操作类似于常规 reader 但会将每行中的信息映射到一个 OrderedDict,其中的键由可选的 fieldnames 形参给出。
class csv.DictWriter 创建一个对象,该对象在操作上类似常规 writer,但能将字典映射到输出行
class csv.Dialect Dialect 类是主要依赖于其属性的容器类,用于将定义好的参数传递给特定的 readerwriter 实例。
class csv.excel excel 类定义了 Excel 生成的 CSV 文件的常规属性。它在变种注册表中的名称是 'excel'
class csv.excel_tab excel_tab 类定义了 Excel 生成的、制表符分隔的 CSV 文件的常规属性。它在变种注册表中的名称是 'excel-tab'
class csv.unix_dialect unix_dialect 类定义了在 UNIX 系统上生成的 CSV 文件的常规属性,即使用 '\n' 作为换行符,且所有字段都有引号包围。
class csv.Sniffer Sniffer 类用于推断 CSV 文件的格式。

csv模块定义了以下常量:

csv.QUOTE_ALL 指示 writer 对象给所有字段加上引号
csv.QUOTE_MINIMAL 指示 writer 对象仅为包含特殊字符(例如 定界符引号字符行结束符 中的任何字符)的字段加上引号。
csv.QUOTE_NONNUMERIC 指示 writer 对象为所有非数字字段加上引号。
csv.QUOTE_NONE 指示 writer 对象不使用引号引出字段。

csv模块定义了以下异常:
exception csv.Error
该异常可能由任何发生错误的函数抛出。

二.csv模块实例

2.1 将mysql查询到的数据导出到本地csv文件

代码:

import csv
import pymysql

# 创建mysql连接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='abc123',db='zqs')
cursor = conn.cursor()

sql1 = "select empno,ename , mgr,hiredate from emp where 1 = 1"
headers = ["empno","ename","mgr","hiredate"]

cursor.execute(sql1)

rows = cursor.fetchall()

with open('E:\python\emp.csv', 'w', newline='') as csvfile:
    my_csv_write = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
    my_csv_write.writerow(headers)
    my_csv_write.writerows(rows)

conn.commit()

# 关闭连接
cursor.close()
conn.close()

测试记录:
如下查看可得知,数值、字符、日期以及空值都正常导出到了csv文件

image.png

2.2 将本地csv文件导入到mysql数据库

对于CSV中空值的处理
数值型空值,必须是 %s 而不能使用 '%s'
字符型空值以及时间类型空值,必须是 %s 而不能使用 '%s',但是录入其它非空的字符,又必须用'%s'

用excel打开csv文件截图:


image.png

从上图可以看到 ename列是字符型空值,mgr、comm列是数值型空值,hiredate是日期型空值
Python代码:
db_setting.py

# 存储数据库信息
# 创建一个列表嵌套列表,存储数据库信息
# 依次是 数据库备注、ip、端口、、用户名、密码、登陆数据库名

mysql_msg = [['本地mysql', 'localhost', 3306 , 'root', 'abc123', 'zqs'],
             ['远程mysql', '10.31.1.123', 3306, 'root', 'abc123', 'test']
             ]

mysql_test3.py

import pymysql, datetime
import csv
import db_setting
import math
from numpy import nan as NaN

class mysql_class(object):
    """对mysql的操作创建一个类"""
    def __init__(self, name):
        self.name = name

    def login_mysql(self):
        """获取mysql的登陆信息"""
        mysql_msg = db_setting.mysql_msg
        name = self.name
        for i in range(0,len(mysql_msg) ):
            exec_db = mysql_msg[i]
            if name == exec_db[0]:
                # 根据输入连接数据库
                return exec_db
                # conn = pymysql.connect(host=exec_db[1], port=exec_db[2], user=exec_db[3], passwd=exec_db[4],db=exec_db[5])
            else:
                pass

    def csv_insert_mysql(self):
        """将csv的文件录入到mysql"""

        exec_db = mysql_class.login_mysql(self)
        conn = pymysql.connect(host=exec_db[1], port=exec_db[2], user=exec_db[3], passwd=exec_db[4], db=exec_db[5] ,charset='utf8')

        cursor = conn.cursor()

        # 测试了数值类型还是会存在问题, yyyy/mm/dd 这类时间格式测试了也不会有问题的
        # 数值型空值,必须是 %s 而不能使用 '%s'
        # 字符型空值以及时间类型空值,必须是 %s 而不能使用 '%s',但是录入其它非空的字符,又必须用'%s'
        sql = ""
        sql1 = "insert into emp_csv(empno, ename, job, mgr, hiredate, sal, comm, deptno) values ('%s', %s, '%s', %s, '%s', '%s', %s, '%s') "
        sql2 = "insert into emp_csv(empno, ename, job, mgr, hiredate, sal, comm, deptno) values ('%s', '%s', '%s', %s, '%s', '%s', %s, '%s') "

        sql3 = "insert into emp_csv(empno, ename, job, mgr, hiredate, sal, comm, deptno) values ('%s', '%s', '%s', %s, %s, '%s', %s, '%s') "


        filename = 'E:/python/file_test/emp_csv_2.csv'

        with open(filename, 'r') as f:
            reader = csv.reader(f)
            # print(type(reader))

            for i, row in enumerate(reader):
                # 剔除第一行的列头
                if i > 0:
                    empno = row[0]

                    if  row[1]:
                        ename = row[1]
                    else:
                        ename = 'NULL'

                    job = row[2]

                    if  row[3]:
                        mgr = row[3]
                    else:
                        mgr = 'NULL'

                    if  row[4]:
                        hiredate = row[4]
                    else:
                        hiredate = 'NULL'

                    sal = row[5]

                    if row[6]:
                        comm = row[6]
                    else:
                        comm =  'NULL'

                    deptno = row[7]

                    print(empno, ename, job, mgr , hiredate, sal, comm , deptno)

                    # 遍历列表,循环录入数据
                    if not row[1]:
                        sql = sql1

                    if not row[4]:
                        sql = sql3

                    # 如果存在两列同时为null的情况,还得继续增加判断条件

                    if row[1]:
                        if row[4]:
                            sql = sql2

                    cursor.execute(sql % (empno, ename, job, mgr, hiredate, sal, comm, deptno))



            conn.commit()

            # 关闭连接
            cursor.close()
            conn.close()


if __name__ == '__main__':
    my_class1 = mysql_class('本地mysql')

    my_class1.csv_insert_mysql()

参考:

1.https://docs.python.org/zh-cn/3.6/library/csv.html#

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,406评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,395评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,815评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,537评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,536评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,184评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,776评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,668评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,212评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,299评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,438评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,128评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,807评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,279评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,395评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,827评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,446评论 2 359

推荐阅读更多精彩内容