我在这里看到了类似的问题,但是没有什么是我想要做的。
我正在使用tsv / csv文件读取
try:
dataframe = pd.read_csv(
filepath_or_buffer=filename_or_obj,
sep='\t',
encoding='utf-8',
skip_blank_lines=True,
error_bad_lines=False,
warn_bad_lines=True,
dtype=data_type_dict,
engine='python',
quoting=csv.QUOTE_NONE
)
except UnicodeDecodeError:
dataframe = pd.read_csv(
filepath_or_buffer=exception_filename_or_obj,
sep='\t',
encoding='latin-1',
skip_blank_lines=True,
error_bad_lines=False,
warn_bad_lines=True,
dtype=data_type_dict,
engine='python',
quoting=csv.QUOTE_NONE
)
我在文件中明确定义了标题,但有时我看到文件具有意外的其他列,并在控制台中获得以下消息
Skipping line 251643: Expected 20 fields in line 251643, saw 21
这对我的过程很好,我想知道一种方法,可以将这些消息或行记录到数据框或日志文件中,以便知道跳过了哪些行。由于文件可以由任何人提交,并且格式存在问题,因此我对修复此消息不感兴趣,只是记录了失败的行号
在此先感谢:)
编辑:包括tryexcept子句
为了重现该问题,我使用了以下CSV文件(dummy.csv):
F1,F2,F3
11,A,10.54
18,B,0.12,low
24,A,19.00
10,C,7.01,low
22,D,39.11,high
49,E,12.12
可能会注意到,有些行具有额外的字段。
由于我们正在使用error_bad_lines=False
,因此try-except
不会引发任何错误/异常,所以这不是前进的道路。我们需要重定向stderr
:
from contextlib import redirect_stderr
import pandas as pd
# import io
with open('error_messages.log', 'w') as h:
# f = io.StringIO()
# with redirect_stderr(f):
with redirect_stderr(h):
df = pd.read_csv(filepath_or_buffer='dummy.csv',
sep=',', # change it for your data
encoding='latin-1',
skip_blank_lines=True,
error_bad_lines=False,
# dtype=data_type_dict,
engine='python',
# quoting=csv.QUOTE_NONE
)
# h.write(f.getvalue()) # Write the error messages to log file
print(df)
上面的代码会将消息写入日志文件!
这是日志文件的示例输出:
Skipping line 3: Expected 3 fields in line 3, saw 4
Skipping line 5: Expected 3 fields in line 5, saw 4
Skipping line 6: Expected 3 fields in line 6, saw 4
更新资料
根据建议修改了代码(在下面的评论中)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句