python 科学计算

python-csv文件读取

2020-03-11  本文已影响0人  詹亮的小仓库

csv文件读取

  1. csv

    csv文件(Comma-Separated Values)是一种以逗号作为分隔符(当然也可以以其他字符作为分隔符)、以行为数据单位的纯文本数据文件.

    如果发现中文是乱码,那是因为data.csv文件的编码格式是utf-8而不是GBK,转为GBK即可在Excel中正常显示中文。

  2. 写入csv

    数据格式

     data=[
         {'link_href': '/html/yzgdgs/col566/2019-05/23/20190523090027164493217_1.html', 'link_date': '2019-05-23'},
         {'link_href': '/html/yzgdgs/col566/2019-05/22/20190522084617632881162_1.html', 'link_date': '2019-05-22'}
         ]
    

    写入文件

     def save_csv(data):
         import csv
     
         
         with open('links_csv.csv', 'w+') as fp:
             # 获取表头列名列表
             headers = data and list(data[0].keys())
             writer = csv.DictWriter(fp, fieldnames=headers)
             # 写入表头
             writer.writeheader()
             # 写入数据行
             writer.writerows(data)
    
  3. 读取数据

     # coding:utf-8
     # 读写csv文件
     import csv
     import sys
     from collections import OrderedDict
     import json
     reload(sys)
     sys.setdefaultencoding('utf-8')
     
     def read_csv2dicts(csv_file_path, field_names = None):
         '''
         读取csv文件数据到到字典列表中,支持指定特定的列、指定特定的列顺序读取
         :param csv_file_path: csv文件路径
         :param field_names: 指定的列名列表
         '''
         with open(csv_file_path,'r') as csv_file:
             # 读取csv文件表头列名列表
             header_line = csv_file.readlines()[0]
             headers = header_line.strip().split(',')
         
         # 用二进制格式读取csv文件
         with open(csv_file_path,'rb') as csv_file:
             # 用csv文件对象构建reader对象,reader对象可以看作是多个字典的列表(每行一个字典)
             reader = csv.DictReader(csv_file)
             
             # 行数据列表(每行数据为一个有序字典)
             datas = []
             for row_dict in reader:
                 # 行数据JSON字符串
                 row_json_str = ''
                 # 使用有序字典,保持指定的列顺序
                 ordered_row_dict = OrderedDict()
                 # 根据指定的列名列表过滤
                 if field_names:
                     # 把原始行数据字典row_dict中的每个字段的数据按照field_names列表的顺序存入ordered_row_dict字典
                     for field in field_names:
                         ordered_row_dict[field] = row_dict[field]
                     # 因为csv模块只能正常处理ASCII字符,为了正常处理中文,这里还需要做个utf-8编码转换
                     row_json_str = json.dumps(ordered_row_dict).encode('utf-8')
                 # 不指定列名的情况,使用csv文件原有表头的列顺序
                 else:
                     # 指定顺序为原有表头顺序(注:如果不这样处理,csv会自动按照key的字典序进行排序)
                     for field in headers:
                         ordered_row_dict[field] = row_dict[field]
                     # 因为csv模块只能正常处理ASCII字符,为了正常处理中文,这里还需要做个utf-8编码转换
                     row_json_str = json.dumps(ordered_row_dict).encode('utf-8')
                 # 把当前行的数据字典对象添加到datas列表,字典保持原有顺序
                 datas.append(json.loads(row_json_str,object_pairs_hook = OrderedDict))
             return datas
上一篇下一篇

猜你喜欢

热点阅读