熊猫无法使用熊猫读取CSV文件,且带有额外的引号字符

时间:2019-10-15 17:18:38

标签: python pandas csv

我有以下条目的CSV

  

“ column1” | “ column2” | “ column3” | “ column4” | “ column5”
  “ 123” | “ sometext”,“ this somedata”,“ 8 inch”“,” hello“

当我尝试读取8 inches"时出现问题,我无法使用read_csv()读取csv。

Pandas.read_csv(io.BytesIO(obj['Body'].read()), sep="|",
                                      quoting=1,
                                      engine='c', error_bad_lines=False, warn_bad_lines=True,
                                      encoding="utf-8", converters=pandas_config['converters'],skipinitialspace=True,escapechar='\"')

有没有一种方法可以处理单元格中的报价。

2 个答案:

答案 0 :(得分:2)

从为这种情况传递适当的参数开始:

  1. sep ='[|,]'-有两个分隔符:一个 pipe 字符和一个逗号, 因此将它们定义为 regex
  2. skipinitialspace = True -您的源文本包含多余的空格(在 分隔符),因此您应该放下它们。
  3. engine ='python'-禁止显示有关下降到 “ python”引擎

仅上述选项就可以调用 read_csv ,没有错误,但缺点是 (目前)是保留双引号。

要消除它们,至少从数据行中消除,还需要另一个技巧:

定义转换器(lambda)函数:

cnv = lambda txt: txt.replace('"', '')

并将其应用于所有源列。

在您的情况下,您有5列,因此为了使代码简洁明了, 您可以使用词典理解

{ i: cnv for i in range(5) }

因此整个代码可以是:

df = pd.read_csv(io.StringIO(txt), sep='[|,]', skipinitialspace=True,
    engine='python', converters={ i: cnv for i in range(5) })

结果是:

  "column1"  "column2"       "column3"  "column4"  "column5"
0      123    sometext   this somedata   8 inches      hello

但是请记住,现在所有列都是 string 类型,因此您应该 将所需的列转换为数字。 一种替代方法是为数字列传递第二个转换器, 返回数字,而不是字符串。

要使用正确的列名(不带双引号),可以传递其他参数:

  • skiprows = 1 -省略第一行,
  • names = [“ column1”,“ column2”,“ column3”,“ column4”,“ column5”] -至 自己定义列列表。

答案 1 :(得分:0)

我们可以指定一个稍微复杂的分隔符,读取数据并去除多余的引号字符:

# Test data:
text='''"column1"| "column2"| "column3"| "column4"| "column5" 
        "123" | "sometext", "this somedata", "8 inches"", "hello"'''
ff=io.StringIO(text)


df= pd.read_csv(ff,sep=r'"\s*[|,]\s*"',engine="python")
# Make it tidy:
df= df.transform(lambda s: s.str.strip('"'))
df.columns= ["column1"]+list(df.columns[1:-1])+["column5"]

结果:

  column1   column2        column3   column4 column5
0     123  sometext  this somedata  8 inches   hello
相关问题