我们在读入txt、csv等数据时,经常会需要根据列名将读入的字符串进行分割。比较简单的数据处理就是文件中每行每列都有数据存在,并且一行数据之间以某种符号(空格,逗号等)分割。但有些字符串中会有各种比较难处理的符号。但比如有如下的一个字符串存放在csv格式的文件中。
Q9UI32,“Glutaminase liver isoform,mitochondrial”,GLS2,FTSI_HAEIN,"",,,,1574687
这个文件本身有9列,所以该字符串应该被正确的分割为9个字符。看到数据首先会想到字符串的split方法,将逗号作为分隔符来分割该字符串,但是实际结果却并不是我们所期望的,具体见后面代码及结果(需要说明的是FTSI_HAEIN字符后面是双引号,双引号后的几个逗号之间是没有空格的,双引号后面的第一个逗号是两个字符之间的分隔符,另外三个逗号表示了对应的三列数据为空)
假如我们将该字符串存放在test.csv中,并且test.csv中只存放这一个字符串。后面的代码都是基于此的。
filename='D:/test.csv'
f=open(filename,'r')
lines=f.readlines()
for line in lines:
temp1=line.strip()
temp2=temp1.split(',')
print(temp2)
['Q9UI32', '"Glutaminase liver isoform', 'mitochondrial"', 'GLS2', 'FTSI_HAEIN', '""', '', '', '', '1574687']
用这样的方法处理的话会分割双引号中以逗号分割的字符也分开来,这并不是我们期望的结果。
看到split分割的结果,我们可能会想到用shlex模块来解决,该模块分割可以忽略引号中的逗号。
import shlex
filename='D:/test.csv'
f=open(filename,'r')
lines=f.readlines()
for line in lines:
temp1=line.strip()
temp1=shlex.shlex(temp1)
temp1.whitespace=','
temp1.whitespace_split=True
temp2=list(temp1)
print(temp2)
['Q9UI32', '"Glutaminase liver isoform,mitochondrial"', 'GLS2', 'FTSI_HAEIN', '""', '1574687']
双引号中的字符串没有被分割,但是后面的逗号都被当做空格分割了。所以这个方法还是不可行。
import csv
filename='D:/test.csv'
f=open(filename)
reader=csv.reader(f)
for row in reader:
print(row)
['Q9UI32', 'Glutaminase liver isoform,mitochondrial', 'GLS2', 'FTSI_HAEIN', '', '', '', '', '1574687']
可以看到,对于csv中的数据,使用csv模块读入时非常方便的。这时不论是想将数据存入excel表格或是提取某个值都可以按列表的方式方便提取。