簡體   English   中英

Pandas 在 read_csv 中跳過行,我可以將這些記錄到變量/日志文件中嗎

[英]Pandas skipping lines when in read_csv, can I record these to variable/log file

我在這里看到了類似的問題,但沒有什么是我想做的。

我正在使用 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

這對我的過程很好,我只想知道一種方法可以將這些消息或行記錄到 dataframe 或日志文件中,以便我知道哪些行已被跳過。 由於任何人都可以提交文件並且這是格式問題,我對修復消息不感興趣,只是記錄失敗的行號

提前非常感謝:)

編輯:包括 try except 子句

為了重現該問題,我使用了以下 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)

上面的代碼會將消息寫入日志文件!

這是來自日志文件的示例 output:

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

更新

根據建議修改了代碼(在下面的評論中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM