Python 使用逗号和双引号读取csv

Python 使用逗号和双引号读取csv,python,pandas,csv,Python,Pandas,Csv,我在S3存储桶中有一个CSV文件(逗号分隔)。 很少有字段有逗号,CSV文件如下所示: Q,W,E,R A,S,"D,F",G Z,X,C,V 当我在pandas中阅读这篇文章时,我应该在一列中得到4列“D,F”,但我得到了一个额外的列 我的代码;我尝试了不同的东西,但所有的尝试都不起作用: import io import csv import pandas as pd #encoding result = chardet.detect(self.raw_content

我在S3存储桶中有一个CSV文件(逗号分隔)。 很少有字段有逗号,CSV文件如下所示:

Q,W,E,R
A,S,"D,F",G
Z,X,C,V
当我在
pandas
中阅读这篇文章时,我应该在一列中得到4列
“D,F”
,但我得到了一个额外的列

我的代码;我尝试了不同的东西,但所有的尝试都不起作用:

import io
import csv
import pandas as pd

#encoding
result = chardet.detect(self.raw_content)
self.encoding = result['encoding']

#csv_delimiter 
is being read from the DB ( , in this case)

#max_columns 
is NUMBER of columns in the csv file

#reading from s3 bucket
self.raw_content = obj['Body'].read()
content = io.BytesIO(self.raw_content)

#Try 1
df_s3_file = pd.read_csv(content, delimiter=csv_delimiter, engine='python',
    dtype=object, encoding=self.encoding, quotechar='"',
    names=list(range(0,max_columns)))

#Try 2
df_s3_file = pd.read_csv(content, delimiter=csv_delimiter, engine='python',
    dtype=object, encoding=self.encoding, quoting=csv.QUOTE_ALL,
    names=list(range(0,max_columns)))

#Try 3
df_s3_file = pd.read_csv(content, delimiter=csv_delimiter, dtype=object,
    encoding=self.encoding, quoting=csv.QUOTE_ALL,
    names=list(range(0,max_columns)))           
当前结果:

0    1    2    4    5
Q    W    E    R    NaN
A    S    "D   F"   G
Z    X    C    V    NaN  
预期结果:

0    1    2    4
Q    W    E    R
A    S    D,F  G
Z    X    C    V

您可以使用以下代码(之后)进行处理:


熊猫可以解析这一点。问题可能在于内容。我不知道变量中没有显示的值。看到您丢失了一个双引号,我将检查哪个字符表示右引号。即使没有设置任何附加参数,pd.read_csv也应该解析这个细节。注意:这是一个答案,但现在我有了足够的声誉,我把它作为一个评论移到了这里。因此,我尝试使用quoting=csv.QUOTE_ALL,quotechar='10〕“'都是参数,但似乎不起作用。请注意,我正在使用的文件位于s3上,已被读取为BytesIO,StringIO如何对我有用?
StringIO
用于使其成为可以复制和运行的代码块。你为什么要使用
BytesIO
而不仅仅是普通文本来阅读?您是否仍然使用额外的列获得相同的数据帧?因为csv位于S3存储桶上,我发现有一种解决方案是基于BytesIO的。对于StringIO,我需要decode参数,因为输入CSV可能有各种编码类型。BytesIO对我有好处,因此使用它。有什么建议吗?我假设pd.read\u csv需要一个“text-y”类型的对象。也许不是。但显式转换为
BytesIO
似乎是错误的解决方案。您是否尝试将S3对象直接传递到
pd.read\u csv
?Pandas文档表示它支持
filepath\u或\u buffer
参数的S3URL方案。
from io import StringIO
import csv
import pandas as pd

s="""
Q,W,E,R
A,S,"D,F",G
Z,X,C,V
"""
df = pd.read_csv(StringIO(s),
                 names=range(4),
                 sep=',',
                 quoting=csv.QUOTE_ALL,
                 quotechar='"'
                )
print(df)
#    0  1    2  3
# 0  Q  W    E  R
# 1  A  S  D,F  G
# 2  Z  X    C  V