Pandas-如何将无效行写入文本文件?

pokxtpni  于 2022-12-28  发布在  其他
关注(0)|答案(2)|浏览(116)

我有一个CSV文件,我正在使用Python解析它。我发现文件中的一些行有不同的列数。

001;Snow,Jon;19801201
002;Crom,Jake;19920103
003; ;Wise,Frank;19880303   <-- Invalid row
004;Wiseau,Tommy;4324;1323;2323  <-- Invalid row

我想将这些无效行写入单独的文本文件。
我使用这行代码从文件中读取。

df = pd.read_csv('names.csv', header=None,sep=';')

我发现here的一个解决方案是使用以下代码跳过有问题的行:

data = pd.read_csv('file1.csv', on_bad_lines='skip')

我可以将'skip'改为'warn',这将给予有问题的行的行号并跳过该行,但这将返回警告消息而不是行本身。

mitkmikd

mitkmikd1#

由于pandas 1.4.0允许 callable 作为**on_bad_lines**参数,因此允许您对坏行应用更复杂的处理。
版本1.4.0中的新增功能:

callable, function with signature (bad_line: list[str]) -> list[str] | None that will process a single bad line. bad_line is a

由seps拆分的字符串列表。如果函数返回None,则错误行将被忽略。如果函数返回的新字符串列表包含的元素多于预期,则在删除多余元素时将发出ParserWarning。仅在engine=“python”时支持
因此,您可以传递一个自定义函数,该函数将遇到的坏行写入特定文件并返回None(在生成 Dataframe 时跳过该行)。

from functools import partial

def write_bad_line(line, fp, sep=','):
    fp.write(sep.join(line) + '\n')
    return None  # return None to skip the line while processing

bad_lines_fp = open('bad_lines.csv', 'a')
df = pd.read_csv('test.csv', header=None, sep=';', engine='python',
                 on_bad_lines=partial(write_bad_line, sep=';', fp=bad_lines_fp))
bad_lines_fp.close()
print(df)

Dataframe 的输出:

0          1         2
0  1   Snow,Jon  19801201
1  2  Crom,Jake  19920103

bad_lines.csv的内容(通过cat命令):

$ cat bad_lines.csv
003; ;Wise,Frank;19880303
004;Wiseau,Tommy;4324;1323;2323
tzdcorbm

tzdcorbm2#

你可以在载入Pandas之前用一个脚本来分割csv文件,比如:

with open('names.csv') as src, open('good.csv', 'w') as good, open('bad.csv', 'w') as bad:
    for line in src:
        if line.count(';') == 2: # or any other appropriate criteria
            good.write(line)
        else:
            bad.write(line)

相关问题