【Python】CSV,TSV语料读取的简单操作——内建包csv的使用
背景
在做文本相关的任务时,难免会遇见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.writer
、csv.DictWriter
。
按行写入程序案例
csv格式数据写入案例:
import csvhead = ["head" + str(i) for i in range(1, 6)] # 生成csv headdata_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 csvhead = ["head" + str(i) for i in range(1, 6)] # 生成csv headdata_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 csvdef write_data(style='csv', write_style='list') -> None:head = ["head" + str(i) for i in range(1, 6)] # 生成csv headif 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 dataif __name__ == '__main__':import pprintdata = read_data("dict_writer_by_list.csv")pprint.pprint(data)
运行结果如下:
总结
总的来说,使用csv内建包,无论数据写入还是数据读取都比较简洁方便,定制化也比较容易,可以根据自己实际的工程需要进行定制化开发。以上的全部代码如下:
import csv
from typing import Anydef write_data(style='csv', write_style='list') -> None:head = ["head" + str(i) for i in range(1, 6)] # 生成csv headif 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 dataif __name__ == '__main__':import pprint# write_data(write_style='dict')data = read_data("dict_writer_by_list.csv")pprint.pprint(data)
感谢不错的话,记得给我 “一键三连” 哦
【Python】CSV,TSV语料读取的简单操作——内建包csv的使用相关推荐
- python对文件的读操作有哪些方法-Python中文件的读取和写入操作
从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...
- python对文件的读操作方法有哪些-Python中文件的读取和写入操作
从文件中读取数据 读取整个文件 这里假设在当前目录下有一个文件名为'pi_digits.txt'的文本文件,里面的数据如下: 3.1415926535 8979323846 2643383279 wi ...
- python连接到SQList数据库以及简单操作
python连接到SQList数据库以及简单操作 背景了解: Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用.Python定义了一套操作数据库 ...
- R语言:从 csv 文件中读取数据,然后将数据写入 csv 文件
在 R 中,我们可以从存储在 R 环境外部的文件读取数据.我们还可以将数据写入将由操作系统存储和访问的文件中.R可以读取和写入各种文件格式,如csv,excel,xml等. 在本章中,我们将学习从 c ...
- Python文件操作-文本文件、二进制文件、csv文件的读取写入、OS、shutil、CSV模块、常用字符编码
Python文件操作 文本文件和二进制文件 文件操作相关模块 open()创建文件对象 文件对象的常用属性和方法 pickle 序列化 文本文件读取和写入 文本文件写入步骤 write()/write ...
- office是python打开方式_Python读取word文本操作详解
本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...
- python生成递增序列_Python的6种内建序列之通用操作
数据结构式通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence).序列中的每 ...
- Python零基础教程:函数和类内建魔法属性
前言 关于对象的魔法方法我们已经讲得太多,但是对于类或函数内建的魔法属性和功能我们涉及较少,下面系统了解一下类和函数的内建属性. 查看内建属性 class Person(object):passdef ...
- Python openpyxl 之 Excel 文档简单操作
背景:生活中常常因日常工作,在记录统计方面需频繁处理较多 Excel 表格,这部分工作虽可由人工完成,但这样会显得有些繁琐且可能存在偏差,遂闲时查阅了是否有相关基于python处理Excel表格的学习 ...
最新文章
- php 开发cs,PHP开发CS结构的技巧
- 开发转测试没人要_入行或转行软件测试(测试开发)要怎么学
- 单链表倒数第K个节点的查找和显示
- 中国SaaS死或生之五:目标、方法、钱,一个都不能少
- php中获取ip的地域信息比较精准
- 2. Add Two Numbers 两数相加
- JAVA实现telnet代理,对输入命令拦截
- android简单的夜间模式
- linux绑定team网卡,linux 实现双网卡绑定单个IP——team篇
- 信息学奥赛一本通C++语言——1119:矩阵交换行
- 斑能不能彻底去掉_海鲜不能和什么一起吃
- arm linux 蜂鸣器qt,Qt 程序中使用蜂鸣器 ioctl()
- Word2Vec 与 Word Embedding的关系
- python windows7下创建~/.pypirc文件
- 多线程的Lock锁——ReentrantReadWriteLock
- 管家婆普及版_昆明逸马软件 — 管家婆普及版新手入门指南
- steam换头像出现服务器错误_推特热搜第二!史上bug最多的游戏终于出现…
- 第4节课第一节 Dos攻击
- Pytorch 微调(Fine-tuning)
- 师太、老衲、贫道的爱恨全集
热门文章
- 计算机校本研究题目,信息技术小课题研究题目大全
- <<视觉问答>>2021:Zero-shot Visual Question Answering usingKnowledge Graph
- ATECLOUD智能云测试平台-测试测量/仪器程控/工业控制/上位机开发软件
- 人工智能导论笔记-第四章-不确定性推理方法
- csv和json文件
- java括号用法_Java双括弧使用技巧
- (DP)codeforces - 710E Generate a String
- adguard没有核心 core no_树莓派安装AdGuard Home屏蔽广告
- C1认证学习六(HTTPS)
- EMWin对话框(Diolog)通知框(Messa…