python-csv模块

300 阅读3分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」写自动化测试框架中用到了python的csv模块去解析csv文件,总结一下,增强记忆

基础

官方文档链接docs.python.org/zh-cn/3/lib…

csv模块实现了csv格式表单数据的读写,主要有 reader和writer读写序列化数据, DictReader,DictWriter类用于读写字典形式的数据

模块内容

csv.reader()

直接看源码

def reader(iterable, dialect='excel', *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    csv_reader = reader(iterable [, dialect='excel']
                            [optional keyword args])
        for row in csv_reader:
            process(row)
    
    The "iterable" argument can be any object that returns a line
    of input for each iteration, such as a file object or a list.  The
    optional "dialect" parameter is discussed below.  The function
    also accepts optional keyword arguments which override settings
    provided by the dialect.
    
    The returned object is an iterator.  Each iteration returns a row
    of the CSV file (which can span multiple input lines).
    """
    pass

第一个参数是csvfile,或者其他可迭代对象,所以文件对象和列表对象都适用

第二个参数是默认参数,标识不同的csv变种,可以是dialect类的子类的实例,我们可以看源码,我们默认赋值为excel,它其实是dialect的子类,如图

图片.png

这个参数我们操作csv文件一般不用管

后面是可选参数,例如官方文档指出,如果要读csvfile,需设置newline="",还有官方的解释是这样的如果没有指定 newline='',则嵌入引号中的换行符将无法正确解析,并且在写入时,使用 \r\n 换行的平台会有多余的 \r 写入。由于 csv 模块会执行自己的(通用)换行符处理,因此指定 newline='' 应该总是安全的。

这个函数会把csv文件中的每一行都读取为一个由字符串组成的列表。举例,例如获取指定某一行的内容

row = ''
with open(csv_file_name, newline="") as csv_file:
  reader = csv.reader(csv_file)
  for i, rows in enumerate(reader):
      if i == row_index:
          row = rows
print(row)

csv.writer()

看源码

def writer(fileobj, dialect='excel', *args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__ 
    """
    csv_writer = csv.writer(fileobj [, dialect='excel']
                                [optional keyword args])
        for row in sequence:
            csv_writer.writerow(row)
    
        [or]
    
        csv_writer = csv.writer(fileobj [, dialect='excel']
                                [optional keyword args])
        csv_writer.writerows(rows)
    
    The "fileobj" argument can be any object that supports the file API.
    """
    pass

返回一个writer对象,该对象负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串

第一个参数是一个文件类对象,表示它有write方法 第二个参数和reader()一样,一般不用管 后续也是可变参数 write对象有两个方法,writerow()和writerows() 看源码

图片.png 简单示例

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)

简单使用reader和writer

我实现了一个操作csv文件的类,可以对它读写编辑

(1)简单的写入,操作文件跟普通的文件方式一样,模式w表示写入会覆盖已写入内容,a表示写入追加的方式 如果打开的文件的不存在,会新建一个

图片.png

测试,给这个新文件写入一行

图片.png

以文本方式打开这个csv文件查看写入的内容

图片.png

以excel程序打开这个csv文件查看写入的内容

图片.png

现在把函数中的writerow换成writerows试试看

图片.png

测试结果

图片.png

(2)读取这个csv文件,某一行的内容

图片.png

测试,默认读取第一行内容

图片.png

复杂的编辑和处理单元格就不在这里一一展示了,结合csv reader和writer和文件,列表的处理,会得到自己想要的