我有一个csv文件,例如
id,body,category,subcategory,number,smstype,smsflag
50043,“尊敬的客户,感谢您的注册”,DM-YEBA,收件箱,0
30082,恭喜!您的帐户已被激活。,,, DM-SBAW,收件箱,0
当我使用pd.read_csv()
时,整个第一次观察都包含在id
列中,并且由于用于消息正文的双引号而没有在其他列中分开,而在第二次观察中该行在各列之间正确分隔。
查看pd.read_csv实际在做什么。它在id列中包含整个观察结果
当我在记事本中打开csv文件时,它会在整行中添加额外的引号,最终导致惨败,并且文件中已经存在的引号被另一个'“'转义,如下所示。
id,body,category,subcategory,number,smstype,smsflag
“ 50043,”“尊敬的客户,谢谢您的注册”“” ,, DM-YEBA,收件箱,0“
30082,恭喜!您的帐户已被激活。,,, DM-SBAW,收件箱,0
答案 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()