熊猫,读取CSV忽略额外的逗号

时间:2018-02-07 15:59:12

标签: python pandas

我正在读取一个包含8列Pandas数据帧的CSV文件。最后一列包含一条错误消息,其中一些包含逗号。这会导致文件读取失败并显示错误ParserError: Error tokenizing data. C error: Expected 8 fields in line 21922, saw 9

有没有办法在第8个字段后忽略所有逗号,而不是必须浏览文件并删除多余的逗号?

读取文件的代码:

import pandas as pd
df = pd.read_csv('C:\\somepath\\output.csv')

行有效:

061AE,Active,001,2017_02_24 15_18_01,00006,1,00013,some message

失败的行:

061AE,Active,001,2017_02_24 15_18_01,00006,1,00013,longer message, with commas

4 个答案:

答案 0 :(得分:6)

您可以使用import pandas as pd from io import StringIO import re for_pd = StringIO() with open('MikeS159.csv') as mike: for line in mike: new_line = re.sub(r',', '|', line.rstrip(), count=7) print (new_line, file=for_pd) for_pd.seek(0) df = pd.read_csv(for_pd, sep='|', header=None) print (df) 将前几个逗号替换为' |',将中间结果保存在 0 1 2 3 4 5 6 \ 0 061AE Active 1 2017_02_24 15_18_01 6 1 13 1 061AE Active 1 2017_02_24 15_18_01 6 1 13 7 0 some message 1 longer message, with commas 然后处理。

Application.Goto Worksheets(2).Range("A101"), True
With ActiveWindow
 .SplitColumn = 0
 .SplitRow = 10
 .FreezePanes = True
End With

我将问题中的两行放入文件中以获得此输出。

jQuery('.mean-nav ul').hide();

答案 1 :(得分:3)

您可以使用read_csv函数中的参数usecols来限制您读入的列。例如:

import pandas as pd
pd.read_csv(path, usecols=range(8))

如果您只想阅读前8列。

答案 2 :(得分:3)

您可以在Pandas issues page上张贴的这个环形交叉路口拍摄:

import csv
import pandas as pd
import numpy as np

df = pd.read_csv('filename.csv', parse_dates=True, dtype=Object, delimiter="\t", quoting=csv.QUOTE_NONE, encoding='utf-8')

您还可以对数据进行预处理,基本上将所有前7个(第0个到第6个,包括首字母)逗号分别更改为分号,然后将之后的内容更改为逗号*,使用类似的内容:

to_write = []
counter = 0
with open("sampleCSV.csv", "r") as f:
    for line in f:
        while counter < 7:
            line = list(line)
            line[line.index(",")] = ";"
            counter += 1
        counter = 0
        to_write.append("".join(line))

您现在可以将此to_write列表视为像

这样的Pandas对象
data = pd.DataFrame(to_write)
data = pd.DataFrame(data[0].str.split(";").values.tolist()),

或将其写回csv并使用带有分号分隔符的pandas进行读取,例如read_csv(csv_path, sep=';')

我在没有经过严格测试的情况下快速起草了这个,但是应该给你一些尝试的想法。请评论是否有帮助,我会对其进行编辑。

*另一个选项是在7日之后删除所有逗号,并继续使用逗号分隔符。无论哪种方式,要点是将前7个分隔符与后续标点符号区分开来。

答案 3 :(得分:0)

加入@Tblaz答案如果您使用 GoogleColab ,则可以使用此解决方案,在我的情况下,第24列是多余的逗号,所以我只需要阅读23列:

import pandas as pd
from google.colab import files
import io
uploaded = files.upload()
x_train = pd.read_csv(io.StringIO(uploaded['x_train.csv'].decode('utf-8')), skiprows=1, usecols=range(23) ,header=None)