Python 以逗號分割字串且忽略引號中的逗號

2021-09-28 12:30:38 字數 2003 閱讀 3788

我們在讀入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**或是提取某個值都可以按列表的方式方便提取。

逗號分割的字串轉成表

1.建立乙個type create or replace type tools strlist 2.建立乙個function create or replace function tools str2list str in in varchar2 return tools strlist is v ...

strtok讀取以逗號分開的字串

strtok 原型 extern char strtok char s,char delim 用法 include 功能 分解字串為一組標記串。s為要分解的字串,delim為分隔符字串。說明 首次呼叫時,s必須指向要分解的字串,隨後呼叫要把s設成null。strtok在s中查詢包含在delim中的字...

mysql 查詢以逗號相隔的字串

首先我們建立一張帶有逗號分隔的字串。create table test id int 6 not null auto increment,primary key id pname varchar 20 not null,pnum varchar 50 not null 然後插入帶有逗號分隔的測試資料...