zoukankan      html  css  js  c++  java
  • 【Python】Python处理csv文件

    Python处理csv文件

    CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看。由于是纯文本,任何编辑器也都可打开。与Excel文件不同,CSV文件中:

    • 值没有类型,所有值都是字符串
    • 不能指定字体颜色等样式
    • 不能指定单元格的宽高,不能合并单元格
    • 没有多个工作表
    • 不能嵌入图像图表

    在CSV文件中,以,作为分隔符,分隔两个单元格。像这样a,,c表示单元格a和单元格c之间有个空白的单元格。依此类推。

    不是每个逗号都表示单元格之间的分界。所以即使CSV是纯文本文件,也坚持使用专门的模块进行处理。Python内置了csv模块。先看看一个简单的例子。

    从CSV文件中读取数据

    import csv
    
    filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
    with open(filename) as f:
        reader = csv.reader(f)
        print(list(reader))

    data不能直接打印,list(data)最外层是list,里层的每一行数据都在一个list中,有点像这样

    [['name', 'age'], ['Bob', '14'], ['Tom', '23'], ...]

    于是我们可以这样访问到Bob的年龄reader[1][1], 在for循环中遍历如下

    import csv
    
    filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
    with open(filename) as f:
        reader = csv.reader(f)
        for row in reader:
            # 行号从1开始
            print(reader.line_num, row)

    截取一部分输出

    1 ['AKST', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF', 'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity', ' Mean Humidity', ' Min Humidity', ' Max Sea Level PressureIn', ' Mean Sea Level PressureIn', ' Min Sea Level PressureIn', ' Max VisibilityMiles', ' Mean VisibilityMiles', ' Min VisibilityMiles', ' Max Wind SpeedMPH', ' Mean Wind SpeedMPH', ' Max Gust SpeedMPH', 'PrecipitationIn', ' CloudCover', ' Events', ' WindDirDegrees']
    2 ['2014-1-1', '46', '42', '37', '40', '38', '36', '97', '86', '76', '29.95', '29.77', '29.57', '10', '8', '2', '25', '14', '36', '0.69', '8', 'Rain', '138']
    ...

    前面的数字是行号,从1开始,可以用reader.line_num获取。

    要注意的是,reader只能被遍历一次。由于reader是可迭代对象,可以使用next方法一次获取一行。

    import csv
    
    filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
    with open(filename) as f:
        reader = csv.reader(f)
        # 读取一行,下面的reader中已经没有该行了
        head_row = next(reader)
        for row in reader:
            # 行号从2开始
            print(reader.line_num, row)

    写数据到csv文件中

    有reader可以读取,当然也有writer可以写入。一次写入一行,一次写入多行都可以。

    import csv
    
    # 使用数字和字符串的数字都可以
    datas = [['name', 'age'],
             ['Bob', 14],
             ['Tom', 23],
            ['Jerry', '18']]
    
    with open('example.csv', 'w', newline='') as f:
        writer = csv.writer(f)
        for row in datas:
            writer.writerow(row)
            
        # 还可以写入多行
        writer.writerows(datas)

    如果不指定newline='',则每写入一行将有一空行被写入。上面的代码生成如下内容。

    name,age
    Bob,14
    Tom,23
    Jerry,18
    name,age
    Bob,14
    Tom,23
    Jerry,18

    DictReader和DictWriter对象

    使用DictReader可以像操作字典那样获取数据,把表的第一行(一般是标头)作为key。可访问每一行中那个某个key对应的数据。

    import csv
    
    filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
    with open(filename) as f:
        reader = csv.DictReader(f)
        for row in reader:
            # Max TemperatureF是表第一行的某个数据,作为key
            max_temp = row['Max TemperatureF']
            print(max_temp)

    使用DictWriter类,可以写入字典形式的数据,同样键也是标头(表格第一行)。

    import 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)

    就先了解到这儿。

  • 相关阅读:
    day29 Pyhton 面向对象 继承进阶
    UX&UI的介绍区别
    APP设计中“登录”按钮的高度多少才好呢?经验总结!
    新人与三年经验的交互设计师有多大的差距?
    UI设计师是混哪一块?要做什么?图文结合详解
    是时候重新审视正在流行的卡片设计趋势了!
    图表设计的介绍及指导
    完整的交互设计流程应该是怎样的?
    设计师如何用产品思维提升用户体验?
    2015年最流行的渐变技巧!
  • 原文地址:https://www.cnblogs.com/yanglang/p/7126660.html
Copyright © 2011-2022 走看看