提问人:eroma934 提问时间:9/1/2015 最后编辑:Sunderam Dubeyeroma934 更新时间:5/26/2022 访问量:11060
Pandas 坏线警告捕获
Pandas Bad Lines Warning Capture
问:
Pandas 中有什么方法可以捕获通过设置 error_bad_lines = False 和 warn_bad_lines = True 而产生的警告?例如,以下脚本:
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。
答:
9赞
jezrael
9/2/2015
#1
我的解决方案:
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
9/3/2015
谢谢!我可能会选择第二种解决方案,因为我需要遍历多个文件,不幸的是,我们坚持使用这种格式。
5赞
staylorx
3/24/2020
#2
我无法帮助您使用比 Python 3 更早的版本,但我在以下方面取得了很好的成功:
import pandas as pd
from contextlib import redirect_stderr
import io
# Redirect stderr to something we can report on.
f = io.StringIO()
with redirect_stderr(f):
df = pd.read_csv(
new_file_name, header=None, error_bad_lines=False, warn_bad_lines=True, dtype=header_types
)
if f.getvalue():
logger.warning("Had parsing errors: {}".format(f.getvalue()))
我多次搜索这个问题,并不断被指向这个问题。希望以后能帮助到其他人。
评论
1赞
scottlittle
6/9/2020
你能定义吗?logger
1赞
Ukrainian-serge
11/26/2020
发布了编辑。 @scottlittle,替换为logger.warning
print
评论