Python-以逗号分割字符串且忽略引号中的逗号

要处理的问题

我们在读入txt、csv等数据时,经常会需要根据列名将读入的字符串进行分割。比较简单的数据处理就是文件中每行每列都有数据存在,并且一行数据之间以某种符号(空格,逗号等)分割。但有些字符串中会有各种比较难处理的符号。但比如有如下的一个字符串存放在csv格式的文件中。
Q9UI32,“Glutaminase liver isoform,mitochondrial”,GLS2,FTSI_HAEIN,"",,,,1574687

这个文件本身有9列,所以该字符串应该被正确的分割为9个字符。看到数据首先会想到字符串的split方法,将逗号作为分隔符来分割该字符串,但是实际结果却并不是我们所期望的,具体见后面代码及结果(需要说明的是FTSI_HAEIN字符后面是双引号,双引号后的几个逗号之间是 没有空格 的,双引号后面的第一个逗号是两个字符之间的分隔符,另外三个逗号表示了对应的三列数据为空)

假如我们将该字符串存放在test.csv中,并且test.csv中只存放这一个字符串。后面的代码都是基于此的。

使用File的readlines读入并使用字符串的split分割

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']

用这样的方法处理的话会分割双引号中以逗号分割的字符也分开来,这并不是我们期望的结果。

使用shlex模块

看到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']

双引号中的字符串没有被分割,但是后面的逗号都被当做空格分割了。所以这个方法还是不可行。

使用csv模块读入数据

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表格或是提取某个值都可以按列表的方式方便提取。

最近研究python  遇到个逗号的问题 一直没弄明白 今天总算搞清楚了 1.逗号在参数传递的使用:      这种情况不多说  没有什么不解的地方 就是形参或者实参传递的时候参数之间的逗号       例如def  abc(a,b)或者abc(1,2) 2.逗号在类型转化的使用 主要是元组的转换 >>> b=(a) public class StringSplit { public static void main(String[] args) { String sourceStr = "1,2,3,4,5"; String[] sourceStrArray = sourceStr.split(","); for (i
字符串切分操作忽略引号的分隔符(具体函数实现) 在数据分析当常常会遇到字符串分割操作,但是有时不想分割引号分割符,不限于引号,这时候单靠 split 函数是无能为力的,我这写了Scala以及Python的递归函数来解决此问题,功能为忽略引号分割符。 将引号字符串进行处理(替换需要分割分割符,或者进行其他替换操作) 函数执行完毕后可以直接使用 split(",") 进行分割,不影...
array_with_quotes = [f"'{element}'" for element in array] # 使用join()方法将带有引号的数组转换为逗号分隔的字符串 string = ', '.join(array_with_quotes) # 打印转换后的字符串 print(string) 输出结果为: 'apple', 'banana', 'orange' 在上面的示例,我们使用列表推导式遍历数组的每个元素,并在每个元素两边添加引号。然后,使用join()方法将带有引号的数组转换为逗号分隔的字符串。你可以根据需要修改引号的类型和位置,以及分隔符。