【Python】CSV,TSV语料读取的简单操作——内建包csv的使用

news2024/11/18 14:49:20

背景

在做文本相关的任务时,难免会遇见csv,tsv等格式的数据,但有时只是读取,然后传入到下一个任务中而已,并不会做过多的操作。在这种情况下,可以使用pandas读取,但是难免有些臃肿,还引入了pandas中的数据结构,虽然在NLP任务中torchtext可以处理相关格式的文本数据,但是其更侧重于为了模型训练做准备的,这个时候也不太适用了。

其实,Python中自带了csv格式数据的读取和写入的包,使用起来也是比较简洁的,如果经常处理csv,tsv格式数据的话,可以将其封装成对应的工具包。下面记录一下csv这个包的具体使用。当然,最权威的使用当属于官方文档:https://docs.python.org/zh-cn/3.8/library/csv.html?highlight=csv#module-csv。

下文代码使用vscode编写,使用vscode中的Excel Viewer插件查看。

生成csv文件

这里主要介绍生成csv文件的两种方式:csv.writercsv.DictWriter

按行写入程序案例

csv格式数据写入案例:

import csv

head = ["head" + str(i) for i in range(1, 6)]  # 生成csv head

data_list = [[(i + 1) * j for i in range(5)] for j in range(1, 10)]  # 生成数据
 
# newline='',否则会在两行之间插入空白行
with open('write_by_line.csv', 'w', encoding='utf8', newline="") as f:
    writer = csv.writer(f)  # 构建csv按行书写对象
    writer.writerow(head)  # 单行写入表头
    writer.writerows(data_list)  # 多行数据写入

csv数据如下:

在这里插入图片描述
在这里插入图片描述
tsv格式数据写入案例,其与csv格式的差别就是在实例化csv按行写入对象中设置delimiter参数为\t

import csv

head = ["head" + str(i) for i in range(1, 6)]  # 生成csv head

data_list = [[(i + 1) * j for i in range(5)] for j in range(1, 10)]  # 生成数据
 
# newline='',否则会在两行之间插入空白行
with open('write_by_line.tsv', 'w', encoding='utf8', newline="") as f:
    writer = csv.writer(f, delimiter='\t')  # 构建csv按行书写对象
    writer.writerow(head)  # 单行写入表头
    writer.writerows(data_list)  # 多行数据写入

生成数据如下:
在这里插入图片描述
在这里插入图片描述

如果生成的文件后缀名不修改成tsv的话,使用Excel Viewer会出现显示异常的情况。

按字典写入对象案例

有时候需要已有的字典数据写入到csv数据中,csv也提供根据字典的key值进行写入,为了更具通用性,下面的程序将按行写入的模块也加入了,最后的代码如下:

import csv


def write_data(style='csv', write_style='list') -> None:
   head = ["head" + str(i) for i in range(1, 6)]  # 生成csv head
   if write_style == 'list':
       data_list = [[(i + 1) * j for i in range(5)] for j in range(1, 10)]  # 生成数据
   elif write_style == 'dict':
       data_list = [{key: j for key in head} for j in range(1, 10)]
   else:
       raise Exception(f'this write_style {write_style}, not in ["list", "dict"]')
       
   if style == 'csv':
       delimiter = ','
       file_name = write_style+"_writer_by_list.csv"
   elif style == 'tsv':
       delimiter = '\t'
       file_name = write_style+"_writer_by_list.tsv"
   else:
       raise Exception(f"this style {style} not in ['csv', 'tsv']")
   # newline='',否则会在两行之间插入空白行
   with open(file_name, 'w', encoding='utf8', newline="") as f:
       if write_style == 'list':
           writer = csv.writer(f, delimiter=delimiter)  # 构建csv按行书写对象
           writer.writerow(head)  # 单行写入表头
       else:
           writer = csv.DictWriter(f, head)
           writer.writeheader()
       writer.writerows(data_list)  # 多行数据写入


if __name__ == '__main__':
   write_data(write_style='dict')

生成的数据如下:
在这里插入图片描述
在这里插入图片描述

csv数据读取

有了csv文件后,按理也应该有两种读取数据的方式。实例如下:

def read_data(file_path, style='csv', delimiter=',') -> Any:
    assert delimiter in [',', '\t'], f"delimiter must in [',','\t'], you input {delimiter}"
    data = {}
    with open(file_path, 'r', encoding='utf8') as f:
        if style == 'csv':
            reader = csv.reader(f, delimiter=delimiter)
        else:
            reader = csv.DictReader(f, delimiter=delimiter)
        data["head"] = next(reader)
        data['content'] = list(reader)
    return data

if __name__ == '__main__':
    import pprint
    data = read_data("dict_writer_by_list.csv")
    pprint.pprint(data)

运行结果如下:
在这里插入图片描述

总结

总的来说,使用csv内建包,无论数据写入还是数据读取都比较简洁方便,定制化也比较容易,可以根据自己实际的工程需要进行定制化开发。以上的全部代码如下:

import csv
from typing import Any


def write_data(style='csv', write_style='list') -> None:
    head = ["head" + str(i) for i in range(1, 6)]  # 生成csv head
    if write_style == 'list':
        data_list = [[(i + 1) * j for i in range(5)] for j in range(1, 10)]  # 生成数据
    elif write_style == 'dict':
        data_list = [{key: j for key in head} for j in range(1, 10)]
    else:
        raise Exception(f'this write_style {write_style}, not in ["list", "dict"]')
        
    if style == 'csv':
        delimiter = ','
        file_name = write_style+"_writer_by_list.csv"
    elif style == 'tsv':
        delimiter = '\t'
        file_name = write_style+"_writer_by_list.tsv"
    else:
        raise Exception(f"this style {style} not in ['csv', 'tsv']")
    # newline='',否则会在两行之间插入空白行
    with open(file_name, 'w', encoding='utf8', newline="") as f:
        if write_style == 'list':
            writer = csv.writer(f, delimiter=delimiter)  # 构建csv按行书写对象
            writer.writerow(head)  # 单行写入表头
        else:
            writer = csv.DictWriter(f, head)  # 传入头
            writer.writeheader() # 写入头
        writer.writerows(data_list)  # 多行数据写入

def read_data(file_path, style='csv', delimiter=',') -> Any:
    assert delimiter in [',', '\t'], f"delimiter must in [',','\t'], you input {delimiter}"
    data = {}
    with open(file_path, 'r', encoding='utf8') as f:
        if style == 'csv':
            reader = csv.reader(f, delimiter=delimiter)
        else:
            reader = csv.DictReader(f, delimiter=delimiter)
        data["head"] = next(reader)
        data['content'] = list(reader)
    return data

if __name__ == '__main__':
    import pprint
    # write_data(write_style='dict')
    data = read_data("dict_writer_by_list.csv")
    pprint.pprint(data)

感谢不错的话,记得给我 “一键三连”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

切记不要接受任何降薪,不要同意任何调岗,更不要害怕HR威胁背调,跟HR聊天都要录音!...

最近很多人都遭遇了裁员和降薪,一位网友给大家提出了几点建议:1.不要接受任何降薪,不要签字同意。如果公司敢降薪就直接去仲裁,但如果签字之后,降薪就属于你情我愿了。2.不要签字同意调岗,调岗会不会有薪水…

【博客559】更出色的网络监控采集方案---Telemetry(遥测技术)

网络监控方案—Telemetry(遥测技术) 1、几种不同采集方式对比:CLI,SNMP,SYSLOG,Telemetry CLI: 作为应用最广使用最久的网络监控技术,最大的问题就是兼容性,同类产品不同厂商之间的兼容性&…

web前端-javascript-创建Array数组和元素类型(字面量创建,构造函数创建,元素可以是任意数据类型,二维数组)

文章目录创建 Array 数组1. 普通方法2. 使用字面量来创建数组3. 使用构造函数来创建数组数组的元素类型1. 创建一个长度为 10 的数组2. 数组中的元素可以是任意的数据类型2.1. 数组中的元素也可以是对象2.2. 也可以是一个函数2.3. 数组中也可以放数组,如下这种数组我们称为二维…

早餐店+饮品+烘焙,如何做多群体早中晚生意?

早餐吃好、午餐吃饱、晚餐少吃,如今早餐店已经不再局限于豆浆油条、鸡蛋面包,同时还有饮品,芳芳珍早鲜奶店是一家早餐店,30个SKU销量很高,一天中有近75%的销售都集中在早餐场景。 这家早餐店是如何做的? 01…

【交通标志识别】BP神经网络交通标志识别(带面板)【含GUI Matlab源码 1647期】

⛄一、BP神经网络交通标志识别简介 道路交通标志用以禁止、警告、指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复杂, 且智能识别技术尚未成熟, 为了得到高效实用的道路标志识别系统, …

笔试训练(2)

// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {StringBuffer s1new StringBuffer("A");StringBuffer s2new StringBuffer("B");process(s1,s2);System.out.println(s1);System.out.pr…

推翻OpenAI结论,DeepMind重新定义预训练的参数和规模关系!

文|王思若前言从20年开始,“最大语言模型”的桂冠被各大研究机构和科技公司竞相追逐,堆砌参数,猛上算力,开启了“大炼丹”时代,模型参数量仿佛越大越好,甚至GPT-4模型参数量将超过100万亿的传闻…

14年本科毕业,3个月转行软件测试月薪13.5k,32的岁我终于找对了方向

​职场奋斗的过程,其实就是不停地做选择,做判断的过程。决定你发展的,多数取决于你的判断和眼光。你任何的投入,都决定了你未来的格局和结局。今天跟大家分享的我的转行故事,一起来看看吧。 为了新的目标和方向&#x…

PDF怎么拆分/合并? 3款 PDF 拆分和合并工具分享

以PDF格式传输文档已广泛使用很长时间,也是传输文档的最常见方式之一。但是,当涉及到从众多PDF文件中提取特定页面并将它们放在一起以制作新的PDF文档时,我们将需要专用软件来合并和拆分多个PDF。 现在,如果您想知道,…

叶面积指数(LAI)介绍以及遥感估算方法

前言 叶面积指数精度是正确预测产量的重要参数之一。 同时,还有那么多疑问,如何才能正确? 以及如何使用最有效的方法计算叶面积指数(LAI)? 什么是最佳 LAI? 哪些估算叶面积指数精度的方法比较好…

Matplotlib基础绘图函数示例

1. pyplot基础图表函数概述 2. pyplot饼图的绘制 3. pyplot直方图的 绘制 4. pyplot极坐标图的绘制 5. pyplot散点图的绘制 单元小结

[附源码]Python计算机毕业设计果蔬预约种植管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

内部分享讲解DevOps后,我再组织成文

DevOps 已然家喻户晓,如果你还没听过,那确实要去补补课。随着敏捷研发的普及,一种快速响应业务、高效运维的模式必然深得众心,Git 的发展近来几乎在代码管理领域一骑绝尘,在此基础上衍生出 GitOps 的概念,成…

MR案例:计算学生成绩(总分和平均分)

文章目录一、提出任务二、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录(二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动器类…

JVM本地锁(一)简单实现

JVM本地锁由ReentrantLock或synchronized实现 模拟场景 假设有个共享库存资源,多线程进行访问,每次访问库存-1. Data public class StockDemo {private Integer stock 5000; }再controller -> service 进行访问调度 Service public class StockD…

题:付账问题

1235. 付账问题 - AcWing题库 几个人一起出去吃饭是常有的事。 但在结帐的时候,常常会出现一些争执。 现在有 nn 个人出去吃饭,他们总共消费了 SS 元。 其中第 ii 个人带了 aiai 元。 幸运的是,所有人带的钱的总数是足够付账的&#xff…

ctf笔记:php

ctf笔记:php 博客链接:https://www.blog.23day.site/articles/80 语法 攻防世界:easy_php 攻防世界:simple_php $a $b等于TRUE,如果类型转换后 $a 等于 $b。$a $b全等TRUE,如果 $a 等于 $b&#xff0c…

【封神台】辛巴猫舍-SQL注入

本节学习目标: 判断是否存在SQL漏洞,以便注入获取数据库的内容本节需知: SQL注入%20为空格的url代码环境为打靶环境1. 判断是否存在SQL漏洞 http://cntj8003.ia.aqlab.cn/index.php?id1%20and%2011 http://cntj8003.ia.aqlab.cn/index.php…

注册VMware虚拟机时报错“指定的项、名称或标识符已存在“

环境 VMware虚拟化平台 问题描述 收到业务侧报障,多台Linux虚拟机无法登录。经查询,报障的Linux操作系统均部署在VMware虚拟化平台,承载的宿主机已宕机且无法启动,虚拟机为断连状态。虚拟机移除清单,离线迁移&#…

图片识别转公式,GitHub 又一 LaTeX 神器面世

​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) 只需要把公式图片用鼠标拖动到工具内,就能一键转成 LaTex 公式。 写论文、做研究时,最让你头疼的是什么?想必公式编辑会榜上有名。那么有没有便捷的…