在某些条目中用引号将csv文件读入pandas数据框

时间:2018-09-26 12:02:49

标签: python pandas csv

我有一个csv文件,例如

  

id,body,category,subcategory,number,smstype,smsflag

     

50043,“尊敬的客户,感谢您的注册”,DM-YEBA,收件箱,0

     

30082,恭喜!您的帐户已被激活。,,, DM-SBAW,收件箱,0

当我使用pd.read_csv()时,整个第一次观察都包含在id列中,并且由于用于消息正文的双引号而没有在其他列中分开,而在第二次观察中该行在各列之间正确分隔。

我应该怎么做才能使第一个观察结果像这张图一样在所有列中分开 enter image description here

查看pd.read_csv实际在做什么。它在id列中包含整个观察结果 vhjn

当我在记事本中打开csv文件时,它会在整行中添加额外的引号,最终导致惨败,并且文件中已经存在的引号被另一个'“'转义,如下所示。

  

id,body,category,subcategory,number,smstype,smsflag

     

“ 50043,”“尊敬的客户,谢谢您的注册”“” ,, DM-YEBA,收件箱,0“

     

30082,恭喜!您的帐户已被激活。,,, DM-SBAW,收件箱,0

4 个答案:

答案 0 :(得分:0)

您可以使用正则表达式删除双引号

1876222901

答案 1 :(得分:0)

在您的示例中,您的问题似乎是Dear customer ...的开始引号与结束引号(不同字符)不同。问题似乎出在您的数据中,而不是pandas.read_csv

如果引号字符始终相同,则可能正在寻找quotechar='"'的{​​{1}}参数。可以在这里找到更多信息:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

答案 2 :(得分:0)

(默认情况下)似乎双引号字符仅在分隔符后紧跟(即逗号和双引号之间没有空格),才被视为代表单数输入的开始。您可以通过使用输入参数skipinitialspace=True(即,忽略定界符后的空格)来解决此问题。以下代码:

import io
import pandas as pd

# Create virtual CSV file
csv_file = io.StringIO(
    'id, body, category, subcategory, number, smstype, smsflag\n'
    '50043, "Dear Customer,Thank you for registering",, , DM - YEBA, inbox, 0\n'
    '30082, Congrats! Your account has been activated.,, , DM - SBAW, inbox, 0\n'
)

# Read out CSV file
df = pd.read_csv(csv_file, skipinitialspace=True)

给出以下结果:

In [1]: df
Out[1]: 
      id                                        body   ...     smstype  smsflag
0  50043     Dear Customer,Thank you for registering   ...       inbox        0
1  30082  Congrats! Your account has been activated.   ...       inbox        0
[2 rows x 7 columns]

答案 3 :(得分:0)

主要问题在于Microsoft excel的csv文件的实际保存方式。在记事本中打开相同的csv文件时,它会在带引号的行中添加额外的引号。

1)它在行的开头和结尾添加引号。

2)它用另一个引号将现有引号转义。 因此,当我们以pandas格式导入csv文件时,它将整行作为一个字符串,因此最终全部出现在第一列中。

要解决这个问题-

  

我导入了csv文件,并通过应用正则表达式替换了csv,并将其保存为文本文件。然后,我将此文本文件导入为pandas数据框。问题已解决。

with open('csvdata.csv','r+') as csv_file:
for line in csv_file:
    # removing starting and ending quotes of a line
    pattern1 = re.compile(r'^"|"$',re.MULTILINE)
    line = re.sub(r'^"|"$',"",line)
    # substituting escaped quote with a single quote
    pattern2 = re.compile(r'""')
    line = re.sub(r'""','"',line)

    corrected_csv = open("new_csv.txt",'a')
    corrected_csv.write(line)
    corrected_csv.close()