拥有自己的Python-CSV模块

在工作中,如果你经常需要读写CSV文本文件,恰好你又会python,那你肯定会使用python中的CSV模块,使用CSV模块读写CSV文件确实轻松了很多。使用最多的两个方法就是 csv.reader()csv.writer()。由于每次读写都需要编写相同的琐碎代码,对于列的处理,还需要代码拆解实现。所以可以将这些琐碎的方法封装起来,变为更贴合自己的工具。

CSV模块的自定义封装

封装此类需要具有的功能:

1. 读取CSV文件

  • 按行读取全列数据
  • 按行读取指定列名的数据
  • 获取CSV数据的行数(从指定的标题列开始数)

2. 写CSV文件

  • 可以指定列表头写入

类代码

下面只列出了功能方法名,代码实现由于空间问题就省略了。具体代码可以下载附件查看。

class CsvOpt:
    def __init__(self, file_name:str, rwmode='r', headline:int=1):
    def read_file(self):---
    def getitem(self, row:int, item:str): ---
    def getrow(self, row:int):---
    def get_maxrow(self):---
    def write_file(self, data_lines:list, head_list:list=[]):---

方法介绍

  1. __ init__(self, file_name:str, rwmode=‘r’, headline:int=1)
    file_name:要操作的csv文件名。
    rwmode:操作文件的读写模式,即 open() 方法中使用的模式,默认为读模式,即 “r”。
    headline:指定csv文件中列头的行号,默认使用第一行作为表头。
    作用:初始化
  2. read_file(self)
    无参函数,作用为读取整个文件内容
  3. getitem(self, row:int, item:str)
    row: 要读取的行号,
    item: 要读取的列的名字
    作用:读取第row行,列名为item的单元的值
  4. getrow(self, row:int)
    row:行号
    作用:获取第row行的所有数据
  5. get_maxrow(self)
    无参函数,返回csv文件从列头位置开始数的行数。
  6. write_file(self, data_lines:list, head_list:list=[])
    data_lines:数据列表,例如:[[行数据],[行数据],[行数据],[行数据]]
    head_list:指定的列头:例如:[‘姓名’,‘年龄’,‘性别’,‘位置’],默认为空
    作用:写数据到指定的csv文件中

使用案例介绍

读取文件

文件名:test.csv

姓名 年龄 地址
张三 17 深圳
李四 18 佛山
周五 19 山西
郑王 20 上海
# -*- coding:utf-8 -*-

from csvopt import CsvOpt

f = "D:\\csvtest\\test.csv"
mycsv = CsvOpt(f) # 初始化文件
mycsv.read_file() # 读取文件

print('按行和指定列名输出:')
for i in range(1, mycsv.get_maxrow() + 1):
    print(mycsv.getitem(i, '姓名'), mycsv.getitem(i, '年龄'))

print('按行输出所有列:')
for i in range(1, mycsv.get_maxrow() + 1):
    print(mycsv.getrow(i))

输出如下:

按行和指定列名输出:
张三 17
李四 18
周五 19
郑王 20
按行输出所有列:
['张三', '17', '深圳']
['李四', '18', '佛山']
['周五', '19', '山西']
['郑王', '20', '上海']

读取指定表头的文件

文件名:test.csv

颜色
白色 红色 黑色 绿色
20 40 10 15
30 40 20 45
12 20 60 75

明显使用第1行的来作为表头就不合适了,需要使用第2行的颜色名字行作为列名来取值
此时只需要在初始化 CsvOpt 时,指定行号就可以了,其它代码不变。

# -*- coding:utf-8 -*-

from csvopt import CsvOpt

f = "D:\\csvtest\\test.csv"
mycsv = CsvOpt(f,headline=2) # 初始化文件
mycsv.read_file() # 读取文件

print('按行和指定列名输出:')
for i in range(1, mycsv.get_maxrow() + 1):
    print(mycsv.getitem(i, '红色'), mycsv.getitem(i, '绿色'))

print('按行输出所有列:')
for i in range(1, mycsv.get_maxrow() + 1):
    print(mycsv.getrow(i))

输出如下:

按行和指定列名输出:
40 15
40 45
20 75
按行输出所有列:
['20', '40', '10', '15']
['30', '40', '20', '45']
['12', '20', '60', '75']

写csv文件

# -*- coding:utf-8 -*-

from csvopt import CsvOpt

mycsv = CsvOpt("D:\\test5.csv", 'w')
# 内容数据
wdatalist = [
    ['辰龙', '50', '太原'], # 第1行数据
    ['巳蛇', '50', '临汾'], # 第2行数据
    ['午马', '50', '潍坊'], # 第3行数据
    ['未时', '50', '烟台'] # 第4行数据
]

mycsv.write_file(wdatalist)

生成的test5.csv文件内容如下:

辰龙 50 太原
巳蛇 50 临汾
午马 50 潍坊
未时 50 烟台

不过一般都会加上表头的,指定表头写入如下:

# -*- coding:utf-8 -*-

from csvopt import CsvOpt

mycsv = CsvOpt("D:\\test5.csv", 'w')

# 指定列名
headline = ['名称','数量','地市']
# 内容数据
wdatalist = [
    ['辰龙', '50', '太原'], # 第1行数据
    ['巳蛇', '50', '临汾'], # 第2行数据
    ['午马', '50', '潍坊'], # 第3行数据
    ['未时', '50', '烟台'] # 第4行数据
]

mycsv.write_file(wdatalist, headline)

生成的test5.csv文件内容如下:

名称 数量 地市
辰龙 50 太原
巳蛇 50 临汾
午马 50 潍坊
未时 50 烟台

猜你喜欢

转载自blog.csdn.net/weixin_44131612/article/details/130942874