zoukankan      html  css  js  c++  java
  • Python--CSV模块

    CSV

    csv文件格式是一种通用的电子表格和数据库导入导出格式

    简介

    Python csv模块封装了常用的功能,使用的简单例子如下:

    写入

    # 写入csv文件
    import csv
    
    csvfile = open('csv_test.csv', 'w',newline='')
    # 如果不指定newline='',有时则每写入一行将有一空行被写入
    writer = csv.writer(csvfile)
    writer.writerow(['姓名', '年龄', '电话']) # 写入一行用writerow
    
    data = [
        ('al', '25', '1367890900'),
        ('eg', '18', '1367890800')
    ]
    writer.writerows(data)  # 多行用writerows
    csvfile.close()

    读取

    # 读取csv文件
    csv_reader = csv.reader(open('csv_test.csv', encoding='utf-8'))
    for row in csv_reader:
        print(row)
        
    # ['姓名', '年龄', '电话']
    # ['al', '25', '1367890900']
    # ['eg', '18', '1367890800']
    

    默认的情况下, 读和写使用逗号做分隔符(delimiter),用双引号作为引用符(quotechar),当遇到特殊情况是,可以根据需要手动指定字符, 例如:

    import csv
    with open('/etc/passwd', 'r') as f:
        reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
        for row in reader:
            print(row)
    
    ['root', 'x', '0', '0', 'root', '/root', '/bin/bash']
    ['bin', 'x', '1', '1', 'bin', '/bin', '/sbin/nologin']
    ['daemon', 'x', '2', '2', 'daemon', '/sbin', '/sbin/nologin']
    ……
    

    上述示例指定冒号作为分隔符,并且指定quote方式为不引用。这意味着读的时候都认为内容是不被默认引用符(")包围的。

    quoting的可选项为: QUOTE_ALL, QUOTE_MINIMAL, QUOTE_NONNUMERIC, QUOTE_NONE.

    有点需要注意的是,当用writer写数据时, None 会被写成空字符串,浮点类型会被调用 repr() 方法转化成字符串。所以非字符串类型的数据会被 str() 成字符串存储。

    字典方式地读写

    csv还提供了一种类似于字典方式的读写,方式如下:

    格式如下:

    headers = ['name', 'age']
    
    datas = [{'name': 'Bob', 'age': 23},
             {'name': 'Jerry', 'age': 44},
             {'name': 'Tom', 'age': 15}
             ]
    
    with open('example.csv', 'w', newline='') as f:
        # 标头在这里传入,作为第一行数据
        writer = csv.DictWriter(f, headers)
        writer.writeheader()
        for row in datas:
            writer.writerow(row)
    
        # 还可以写入多行
        writer.writerows(datas)
    
    
    # 读
    import csv
    with open('example.csv','r') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            print(row['name'], row['age'])
    # name,age
    # Bob,23
    # Jerry,44
    # Tom,15
    # Bob,23
    # Jerry,44
    # Tom,15
    

    案例:使用csv格式展示磁盘空间

    import re
    import csv
    import os
    from prettytable import from_csv
    import subprocess
    # 写入csv文件
    import csv
    
    def cmd_exec(cmd):
        """
         执行shell命令
         返回命令返回值和结果
        :param cmd:
        :return:
        """
        p = subprocess.Popen(cmd,
                             shell=True,
                             stdin=subprocess.PIPE,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
    
        stdout, stderr = p.communicate()
    
        if p.returncode != 0:
            return {'code':p.returncode, 'res':to_str(stderr)}
        return {'code':p.returncode, 'res':to_str(stdout)}
    
    def to_str(bytes_or_str):
        """
        把byte类型转换为str
        :param bytes_or_str:
        :return:
        """
        if isinstance(bytes_or_str, bytes):
            value = bytes_or_str.decode('utf-8')
        else:
            value = bytes_or_str
        return value
    
    
    f = open('disk.csv', 'w+', newline='', encoding='utf-8' )
    fieldnames = ['Dir', 'Use%', 'Avail', 'Used', 'Size']
    writer = csv.writer(f)
    writer.writerow(fieldnames)
    df_ret = cmd_exec('df -h| grep  -E ([1-9]?[1-9]\%)|(100\%)')
    if df_ret['code'] == 0:
        if df_ret['res']:
            for item in df_ret['res'].split('
    ')[:-1]:  # 截取回车
                d = re.split(r's+', item)  # 去除空格符
                writer.writerow(d[-1:-6:-1])
        f.flush()  # 写入到磁盘
        # os.fsync() 方法强制将文件描述符为fd的文件写入硬盘。在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数。
       # 如果你准备操作一个Python文件对象f, 首先f.flush(),然后os.fsync(f.fileno()),
        # 确保与f相关的所有内存都写入了硬盘.在unix,Windows中有效。
        os.fsync(f.fileno())
        f.seek(0)  # 把文件指针置于开头
        tb = from_csv(f)
        ### 设定左对齐
        tb.align = 'l'
        ### 设定T_ID右对齐
        tb.align["Use%"] = "r"
        ### 设定数字输出格式
        tb.float_format = "2.2"
        ### 设定边框连接符为'*"
        tb.junction_char = "*"
        # ### 设定排序列
        # tb.sortby = "Use%"
        # ### 设定排序方式
        # tb.reversesort = True
        ### 设定左侧不填充空白字符
        tb.left_padding_width = 0
        print(tb)  # 打印表格
    
    
    *---------*-----*------*-----*-----*
    |Dir      |Use% |Avail |Used |Size |
    *---------*-----*------*-----*-----*
    |/        | 11% |82G   |9.3G |96G  |
    |/dev/shm |  1% |931M  |72K  |931M |
    |/boot    |  9% |421M  |39M  |485M |
    *---------*-----*------*-----*-----*
    

      

      

  • 相关阅读:
    部署至Oracle数据库的注意事项
    当在centos上面部署项目时,mysql的一些驱动安装不上,
    drf利用redis做缓存是发生一点错误提示
    python字符串前面加个u代表什么
    在学习数据分析时,安装anaconda时遇到一点问题
    在使用scrapy框架爬取sina时,常见保存
    在linux上scrapyd部署scrapy项目时出现service_identity,并且不能识别其中的一个opentype模块
    如何在mysql增加一个和root权限一样的用户,安排
    mysq的root密码忘记,原来还有更优雅的解法
    mysql远程连接阿里云的Ubuntu服务器
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/9188236.html
Copyright © 2011-2022 走看看