Python 数据帧读取错误数据上的csv

Python 数据帧读取错误数据上的csv,python,csv,pandas,Python,Csv,Pandas,我想读取一个非常大的csv(不能在excel中打开和编辑),但是在第100000行的某个地方,有一行有一个额外的列,导致程序崩溃。这一行有错误,所以我需要一种方法来忽略这是一个额外的列这一事实。大约有50列,因此硬编码标题并使用名称或usecols是不可取的。我还可能在其他csv中遇到此问题,并希望得到通用解决方案。很遗憾,我在read_csv中找不到任何内容。代码如下所示: def loadCSV(filePath): dataframe = pd.read_csv(filePath,

我想读取一个非常大的csv(不能在excel中打开和编辑),但是在第100000行的某个地方,有一行有一个额外的列,导致程序崩溃。这一行有错误,所以我需要一种方法来忽略这是一个额外的列这一事实。大约有50列,因此硬编码标题并使用名称或usecols是不可取的。我还可能在其他csv中遇到此问题,并希望得到通用解决方案。很遗憾,我在read_csv中找不到任何内容。代码如下所示:

def loadCSV(filePath):
    dataframe = pd.read_csv(filePath, index_col=False, encoding='iso-8859-1', nrows=1000)
    datakeys = dataframe.keys();
    return dataframe, datakeys
通过跳过错误行:

错误\u错误\u行:布尔值,默认实数行,字段太多 (例如,带有过多逗号的csv行)默认情况下会导致 将引发异常,并且不会返回任何数据帧。如果是假的, 然后,这些“坏行”将从数据帧中删除 返回。(仅对C解析器有效)


要获取有关导致错误的行的信息,请尝试使用
error\u bad\u lines=False
warn\u bad\u lines=True

dataframe = pd.read_csv(filePath, index_col=False, encoding='iso-8859-1', nrows=1000,
                        warn_bad_lines=True, error_bad_lines=False)
error\u bad\u lines=False
跳过导致错误的行,并
warn\u bad\u lines=True
打印错误详细信息和行号,如下所示:

'Skipping line 3: expected 4 fields, saw 3401\nSkipping line 4: expected 4 fields, saw 30...'
如果要保存警告消息(即为了进一步处理),也可以将其保存到文件中(使用
contextlib
):


这是我解决这些问题的方法,速度很慢,但效果很好, 简单地说,只需将CSV文件作为txt文件读取,然后遍历每一行。 如果“,”逗号小于,则跳过该行。 最终确保正确的线路安全

def bad_lines(path):
    import itertools
    num_columns = []
    lines = ""
    
    for i in range(10,50,5):
        content = open(path).readlines(i)[0]
        if (content.count("'") == 0) and (content.count('"') == 0):
            num_columns.append(content.count(","))

    if len(set(num_columns)) == 1:
        for line in itertools.islice(open(path), 0, None):
            if line.count(",") >= num_columns[0]:
                lines = lines + line

    text_file = open("temp.txt", "w")
    n = text_file.write(lines)
    text_file.close()
    
    return("temp.txt")

我忘了提那个。它将适用于我当前想要做的事情,但接下来我希望该行没有附带的额外值。另一种方法是读取一行以获得正确的列数,然后重新读取以仅读取这些列,例如
cols=pd.read\u csv(file,nrows=1)。columns df=pd.read\u csv(file,usecols=cols)
然后,这将忽略我认为该错误行的附加列。请尝试,并让我知道它是否适用于you@Fonti:没有用于
截断错误行的选项。这样做是不好的做法。假设您事先知道数据不好的原因(它附加了一个额外的值)。但是如果它的列太少怎么办?如果额外的值是插入的而不是追加的呢?像这样做是一个bug磁铁。事实上,我刚刚尝试了这个,但它不起作用,我想你需要传递
错误\u bad\u lines=False
并解析警告以获得行号,然后只读取那些带有
header=None
@Edchum的行。这很奇怪,我认为它对我有效。我没有在那一行得到一个错误,而是得到了一个内存错误(400多万行)。要处理的另一条鱼。除上述之外,使用
warn\u bad\u lines=True
可以进一步帮助诊断有问题的行。
def bad_lines(path):
    import itertools
    num_columns = []
    lines = ""
    
    for i in range(10,50,5):
        content = open(path).readlines(i)[0]
        if (content.count("'") == 0) and (content.count('"') == 0):
            num_columns.append(content.count(","))

    if len(set(num_columns)) == 1:
        for line in itertools.islice(open(path), 0, None):
            if line.count(",") >= num_columns[0]:
                lines = lines + line

    text_file = open("temp.txt", "w")
    n = text_file.write(lines)
    text_file.close()
    
    return("temp.txt")