如何将同时具有逗号和空格分隔符的 CSV 文件转换为只有空格分隔符的 csv

Posted

技术标签:

【中文标题】如何将同时具有逗号和空格分隔符的 CSV 文件转换为只有空格分隔符的 csv【英文标题】:How to convert CSV file which having both comma and space delimiter to csv with only space delimiter 【发布时间】:2020-09-01 23:16:52 【问题描述】:

我正在尝试将包含 2 个逗号分隔形式的值的最后一列转换为 2 个单独的列。请参阅输入和输出文件的最后一列以了解动机。

下面是我的输入文件的样子:

fILENAME sent_no    word POS lab,Slab
File_1   sentence:1  abc NNP B,NO   
                     fhj PSP O,O    
                     bmm NNP B,NO   
                     vbn PSP O,O    
                     vbn NN  B,NO   
                     vbn NNPC B,NO  
                     .  Sym O,O 
File_1   Sentence:2 vbb NNP B,NO    
                    bbn PSP B,NO    
                    nnm NNP O,O 
                    nnn PSP B,NO    
                    bbn NN  O,O 
                    .   Sym O,O 

并输出我期望的输出文件如下:

Filename sent_num word POS Label Slab
 File_1 sentence:1 abc NNP B     NO
                   fhj PSP O      O
                   bmm NNP B     NO
                   vbn PSP O      O
                   vbn NN B      NO
                   vbn NNPC B    NO
                   .   Sym O      O
 File_1 Sentence:2 vbb NNP B     NO
                   bbn PSP B     NO
                   nnm NNP O      O
                   nnn PSP B     NO
                   bbn NN  O      O
                   .   Sym O      O

【问题讨论】:

您可以使用任何文本编辑器(notepad++、notepad、atom 等)而不是 excel 来显示文件吗? 【参考方案1】:

试试这个:

import pandas
df = pandas.read_csv('try.csv',sep=';')
df[['Label','Slabel']]=df['Label,Slabel'].str.split(',',expand=True)
df.drop(['Label,Slabel'],axis=1,inplace=True)
df.to_csv('try2.csv',sep=';')

但我看到你的数据使用多索引数据框,所以我添加了这个:

df.set_index(['Filename','Sentence_num'],inplace=True)

结果:

>>> df
                       Word  POS Label Slabel
Filename Sentence_num                        
File_1   sentence:1     abc  NNP     B     NO
         sentence:1     fhj  PSP     O      O
         sentence:1     bmm  NNP     B     NO
         sentence:1     vbn  PSS     O      O
File_2   sentence:2     vbb  NNP     B     NO
         sentence:2     bbn  PSP     B     NO
         sentence:2     nnm  NNP     O      O
         sentence:2    nnnm  PSP     B     NO
>>> 

简单来说,你可以像这样使用多重分隔符:

import pandas as pd
df = pandas.read_csv('try.csv',sep=' |,', engine='python') # separator space and comma

【讨论】:

你为什么用“;”此行中的分隔符 df = pandas.read_csv('try.csv',sep=';') @pooja 。我假设 csv 文件是使用 excel 创建的,所以我使用 ';'因为excel会使用这个分隔符。 如果 csv 文件中带有逗号分隔符的所有列都转换为空格分隔符,那么我必须指定所有列名或以任何其他方式进行 @pooja 如果 csv 文件中带有逗号分隔符的所有列在 csv 文件中看起来像 fILENAME,sent_no,word,POS,lab,Slab 并且只需将分隔符更改为 ',' 在行 df = pandas.read_csv('try.csv',sep=',')。或者如果您想使用多重分隔符,只需更改 sep=';'sep= ' |,'(使用空格和逗号分隔符) 我还使用下面的代码将逗号分隔符 csv 文件更改为空格分隔符 csv 文件:import csv with open(filename1) as in, open(filename2, 'w') as out: out. write(in.read().replace(",", " ")) 但索引列:值是 0,1,2,3 如何从文件中删除它们。通过使用 panda 或任何其他方式使用 csv 模块?【参考方案2】:

您可以使用 pandas 将“逗号分隔”列分成两列。

这是一个示例数据框

import pandas as pd
df = pd.DataFrame([['a,b'], ['c,d']], columns=['Label,Slabel'])

看起来像这样

    Label,Slabel
0   a,b
1   c,d

然后您可以将值转换为列表,然后转换为系列。

df['Label,Slabel'].str.split(',').apply(pd.Series)

结果

    0   1
0   a   b
1   c   d

【讨论】:

【参考方案3】:

我假设 *.csv 文件是

word POS lab,Slab
abc NNP B,NO
fhj PSP O,O
bmm NNP B,NO
vbn PSP O,O
vbn NN B,NO
vbn NNPC B,NO
vbb NNP B,NO
bbn PSP B,NO
nnm NNP O,O
nnn PSP B,NO
bbn NN O,O
. Sym O,O

您可以使用 csv 读取和写入特定分隔符的 csv 文件。

import csv
with open(path, newline='') as csvf:
    rows = csv.reader(csvf, delimiter=' ')
    with open(new_path, 'w', newline='') as new_csvf:
        writer = csv.writer(new_csvf, delimiter=' ')
        for row in rows:
            slab = row[-1].split(',')[-1]
            row.append(slab)
            writer.writerow(row)

【讨论】:

如果 csv 文件中带有逗号分隔符的所有列都转换为空格分隔符,那么我必须指定所有列名或以任何其他方式使用,为什么在读取 csv 文件时使用分隔符 ='',因为它是混合的 with open(filename1) as infile, open(filename2, 'w') as outfile: print(infile.read()) outfile.write(infile.read().replace("," , " ")) 我已经编写了这段代码来将逗号分隔文件的 csv 文件转换为空格分隔文件。但 infile.read() 打印输出中的值为 ,",F,i,l,e,n,a,m,e,",",S,e,n,t,e,n,c,e, ,n,u,m,",",W,o,r,d,",",P,O,S,",",M,E,N,T,,L ,a,b,e,l,",",S,I,N,G,L,E,,M,E,N,T,I,O,N 0,",",f, u,l,l,n,e,w,s,,i,d,_,2,7,1,.,s,s,f,",",s,e,n,t ,e,n,c,e,:,1,",",च,ि,ं,त,ा,",",N,N,",",B,-,M,E,N,T ,",",N,O 为什么我会得到这个?

以上是关于如何将同时具有逗号和空格分隔符的 CSV 文件转换为只有空格分隔符的 csv的主要内容,如果未能解决你的问题,请参考以下文章

打开用空格分隔符保存为逗号分隔符的CSV文件[关闭]

拆分逗号分隔的字符串,同时删除空格和空条目

如何把csv文件转换成“正常的”excel?

如何将逗号分隔的字符串转换为数组?

如何在 BASH 中将制表符分隔值 (TSV) 文件转换为逗号分隔值 (CSV) 文件?

EXCEL(CSV)格式文件如何转换为带逗号分隔符的TXT文件