python读取tsv⽂件_Python读写tsv
Python操作csv和excel的教程随处可见,可惜我遇到的是tsv, 然后可搜到的资料屈指可数,在经历了⼀番努⼒之后终于到了解决⽅案,顺⼿还研究了⼀波⽂件读取,写下来记录⼀下。
⾸先上成果,伸⼿党⾃取:
import csv
def write_to_tsv(output_path: str, file_columns: list, data: list):
with open(output_path, "w", newline="") as wf:
writer = csv.DictWriter(wf, fieldnames=file_columns, dialect='tsv_dialect')
writer.writerows(data)
csv.unregister_dialect('tsv_dialect')
def read_from_tsv(file_path: str, column_names: list) -> list:
with open(file_path, "r") as wf:
reader = csv.DictReader(wf, fieldnames=column_names, dialect='tsv_dialect')
datas = []
for row in reader:
data = dict(row)
datas.append(data)
csv.unregister_dialect('tsv_dialect')
return datas
上⾯就是读写tsv时⽤到的代码了,下⾯写⼀下基础知识点。
⼀、科普
1、Open函数:
open(file, mode=‘r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
其中参数:mode:由两部分组成:⽂件模式:r、w、a,对应着只读、只写、追加模式
数据模式:b、t、+、U,对应着⼆进制模式,⽂本模式,读写模式、通⽤换⾏符,根据实际情况组合与上⾯的的⽂件模式组合使⽤
buffering:可能取值为:0,1, >10:代表buffer关闭,只适⽤于⼆进制模式
1:代表line buffer,只适⽤于⽂本模式
>1:表⽰初始化的buffer⼤⼩
encoding:表⽰的是返回的数据采⽤何种编码,⼀般采⽤utf8或者gbk
errors:可能取值有:strict,ignorestrict:字符编码出现问题的时候,会报错
ignore:编码出现问题,程序会忽略⽽过,继续执⾏下⾯的程序
newline:可以取的值有None, \n, \r, '',‘\r\n' ,⽤于转换换⾏符,但是这个参数只对⽂本模式有效:从流读取输⼊时,如果newline为None,则启⽤通⽤换⾏符模式。输⼊中的⾏可以以'\n','\r'或'\r\n'结尾,它们在返回给调⽤者之前被转换成'\n'。如果它是'',则启⽤通⽤换⾏符模式,但⾏结尾将返回给调⽤者⽽不会转换。如果它具有任何其它合法值,则输⼊⾏仅由给定字符串终⽌,并且⾏结尾被返回给调⽤者⽽不会转换。
将输出写⼊流时,如果newline为None,则写⼊的任何'\n'字符都将转换为系统默认⾏分隔符os.linesep。如果newline是''或'\n',则不会进⾏转换。如果newline是任何其他合法值,写⼊的任何'\n'字符都将转换为给定字符串。
closefd:如果closefd是False并且给出了⽂件描述器⽽不是⽂件名,则当⽂件关闭时,基本⽂件描述器将保持打开。如果给定⽂件名,则closefd必须为True(默认值),否则将产⽣错误。
opener:通过传递可调⽤对象opener可以使⽤⾃定义开启器。然后通过调⽤opener(⽂件,标志)获取⽂件对象的基础⽂件描述器。opener必须返回⼀个打开的⽂件描述器
2、csv.DictWriter函数:
DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
创建⼀个对象,该对象在操作上类似常规 writer,但能将字典映射到输出⾏
其中参数:
fieldnames:必选参数。fieldnames 参数是由键组成的 序列,它指定字典中值的顺序,这些值会按指定顺序传递给 writerow() ⽅法并写⼊⽂件 fextrasaction:如果传⼊的字典的某些键在 fieldnames 中不到,则可选参数extrasact-ion ⽤于指定要执⾏的操作raise:默认值,引发 ValueError
ignore:则字典中的其他键值将被忽略
restval :如果传⼊的字典缺少 fieldnames 中的键,则可选参数 restval ⽤于指定要写⼊的值
dialect:默认Excel,包含其他属性的容器类,⽤于将定义好的参数传递给特定的 reader 或 writer 实例
3、Dialect
为了更容易指定输⼊和输出记录的格式,特定的⼀组格式参数组合为⼀个 dialect。
⽀持以下属性:
Dialect.delimiter :⼀个⽤于分隔字段的单字符,默认为 ','。
Dialect.doublequote:控制出现在字段中的 引号字符 本⾝应如何被引出。当该属性为 True 时,双写引号字符。
如果该属性为 False,则在 引号字符 的前⾯放置 转义符。默认值为 True。
在输出时,如果 doublequote 是 False,且 转义符 未指定,且在字段中发现 引号字符 时,会抛出 Error 异常。
Dialect.escapechar :⼀个⽤于 writer 的单字符,⽤来在 quoting 设置为 QUOTE_NONE 的情况下转义 定界符,在 doublequote 设置为 False 的情况下转义 引号字符。在读取时,escapechar 去除了其后所跟字符的任何特殊含义。该属性默认为 None,表⽰禁⽤转义。
Dialect.lineterminator:放在 writer 产⽣的⾏的结尾,默认为 '\r\n'。
注:reader 经过硬编码,会识别 '\r' 或 '\n' 作为⾏尾,并忽略 lineterminator。
Dialect.quotechar:⼀个单字符,⽤于包住含有特殊字符的字段,特殊字符如 定界符 或 引号字符 或换⾏符。默认为 '"'。
Dialect.quoting:控制 writer 何时⽣成引号,以及 reader 何时识别引号。该属性可以等于任何 QUOTE_* 常量(参见 模块内容 段落),默认为 QUOTE_MINIMAL。
Dialect.skipinitialspace:如果为 True,则忽略 定界符 之后的空格。默认值为 False。
Dialect.strict:如果为 True,则在输⼊错误的 CSV 时抛出 Error 异常。默认值为 False。
⼆、DictWriter & Dialect
简单理⼀下DictWriter和Dialect的关系:Dialect是⽤来装参数的容器,谁的参数?DictWriter的。那么Dialect的参数直接放在DictWriter 中可以吗?完全可以。那么启⽤Dialect的意义是?为了更容易指定输⼊和输出记录的格式。
⽐如咱们要写⼀个超级⽆敌螺旋滚动杀马特格式的csv,将所有的参数都写在DictWriter上可能会变成如下:
csv.DictWriter(wf, fieldnames=file_columns,
lineterminator = "super",
delimiter = "invincible",
doublequote = "spiral",
...)
它可能是⼀个很长的函数,但是引⼊了Dialect,不仅可以把参数都放在⾥⾯,减轻了DictWriter的负担,还可以起⼀个帅⽓、辨识度⾼的名字:
reader = csv.DictReader(wf, fieldnames=column_names, dialect='handsome')
三、tsv & csv
最终的⽬的还是要回到tsv上,先⼀波csv和tsv的基础定义:
CSV: comma separated values;即“逗号分隔值”,⽤逗号分隔数据
TSV:tab separated values;即“制表符分隔值”,⽤制表符分隔数据
所以他们的本质区别在于分隔符的不同,tsv格式是⽤‘\t’分隔,⽽csv格式是⽤‘,’分隔。
分隔符,也就是:Dialect.delimiter,现在⼀切都明了了,修改参数delimiter即可。
然后放⼀下csv包中三个现成的Dialect:
class excel(Dialect):
"""Describe the usual properties of Excel-generated CSV files."""
delimiter = ','
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\r\n'
quoting = QUOTE_MINIMAL
register_dialect("excel", excel)
class excel_tab(excel):
"""Describe the usual properties of Excel-generated TAB-delimited files."""
delimiter = '\t'
register_dialect("excel-tab", excel_tab)
class unix_dialect(Dialect):
python怎么读文件夹下的文件夹"""Describe the usual properties of Unix-generated CSV files."""
delimiter = ','
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\n'
quoting = QUOTE_ALL
register_dialect("unix", unix_dialect)
中间的excel-tab就是现有的为tsv定制的dialect了。
最后放两个⽂档,若有需要请⾃取。
Ref:
CSV 中⽂⽂档csv --- CSV ⽂件读写d
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论