2015-09-01 1 views
3

Есть ли какой-либо способ в Pandas захватить предупреждение, созданное установкой error_bad_lines = False и warn_bad_lines = Правда? Например следующий сценарий:Pandas Bad Lines Предупреждение Capture

import pandas as pd 
from StringIO import StringIO 
data = StringIO("""a,b,c 
        1,2,3 
        4,5,6 
        6,7,8,9 
        1,2,5 
        3,4,5""") 
pd.read_csv(data, warn_bad_lines=True, error_bad_lines=False) 

производит предупреждение:

Skipping line 4: expected 3 fields, saw 4 

я хотел бы сохранить этот вывод в строку, так что я могу в итоге записать его в файл журнала для отслеживания которые пропускаются.

Я попытался использовать модуль , но это не похоже на то, что это «предупреждение» имеет традиционный смысл. Я использую Python 2.7 и Pandas 0.16.

Любая помощь была бы принята с благодарностью.

ответ

3

Я думаю, что это не реализовано для панд.
source1, source2

Мои решения:

1. Предварительно или после обработки

import pandas as pd 
import csv  

df = pd.read_csv('data.csv', warn_bad_lines=True, error_bad_lines=False) 

#compare length of rows by recommended value: 
RECOMMENDED = 3 

with open('data.csv') as csv_file: 
    reader = csv.reader(csv_file, delimiter=',') 
    for row in reader: 
     if (len(row) != RECOMMENDED): 
      print ("Length of row is: %r" % len(row)) 
      print row 

#compare length of rows by length of columns in df 
lencols = len(df.columns) 
print lencols 

with open('data.csv') as csv_file: 
    reader = csv.reader(csv_file, delimiter=',') 
    for row in reader: 
     if (len(row) != lencols): 
      print ("Length of row is: %r" % len(row)) 
      print row 

2. Заменяет sys.stdout

import pandas as pd 
import os 
import sys 

class RedirectStdStreams(object): 
    def __init__(self, stdout=None, stderr=None): 
     self._stdout = stdout or sys.stdout 
     self._stderr = stderr or sys.stderr 

    def __enter__(self): 
     self.old_stdout, self.old_stderr = sys.stdout, sys.stderr 
     self.old_stdout.flush(); self.old_stderr.flush() 
     sys.stdout, sys.stderr = self._stdout, self._stderr 

    def __exit__(self, exc_type, exc_value, traceback): 
     self._stdout.flush(); self._stderr.flush() 
     sys.stdout = self.old_stdout 
     sys.stderr = self.old_stderr 


if __name__ == '__main__': 

    devnull = open('log.txt', 'w') 

    #replaces sys.stdout, sys.stderr, see http://stackoverflow.com/a/6796752/2901002 
    with RedirectStdStreams(stdout=devnull, stderr=devnull): 
     df = pd.read_csv('data.csv', warn_bad_lines=True, error_bad_lines=False) 
+0

Спасибо! Я, вероятно, поеду со вторым решением, так как мне нужно перебирать несколько файлов, и, к сожалению, мы придерживаемся этого формата. – eroma934