【问题标题】:Reading CSV with Separator in column values在列值中使用分隔符读取 CSV
【发布时间】:2022-01-14 03:42:36
【问题描述】:

我有一个保存为 data.csv 的 CSV,看起来像这样,有两列:

Column1|Column2
Titleone|1.5
Title|two|2.5
Title3|3.6

CSV 中的第三行数据包含一个管道运算符,|这导致了错误。我需要一种方法来读取管道运算符作为第三行的 Column1 值的一部分。当我运行pd.read_csv("data.csv", sep = "|") 时出现错误:ParserError: Error tokenizing data. C error: Expected 2 fields in line 3, saw 3

我无法使用,on_bad_lines='skip',因为我使用的是旧版本的 Pandas。这是我发现的一种解决方法,似乎是部分解决方案:

col_names = ["col1", "col2", "col3"]
df = pd.read_csv("data.csv", sep = "|", names = col_names)

【问题讨论】:

  • 您的错误看起来像是来自Title|two|2.5。 “预期 2 个字段,得到 3 个”,因为它读取 field1 = “Title”,field2 = “two”,field3 = 2.5。
  • 为什么不将数据作为单列读取,然后再进行拆分 -> pd.read_csv(squeeze=True)
  • 是的,csv 中的第三行或标题之外的第二行

标签: python pandas numpy csv


【解决方案1】:

on_bad_lines 不推荐使用 error_bad_lines,因此如果您使用的是旧版本的 pandas,则可以使用它:

pd.read_csv("data.csv", sep = "|", error_bad_lines = False)

如果你想保留坏行,你也可以使用warn_bad_lines,从警告中提取坏行并在单个列中单独阅读:

import contextlib

with open('log.txt', 'w') as log:
    with contextlib.redirect_stderr(log):
        df = pd.read_csv('data.csv', sep = '|', error_bad_lines = False, warn_bad_lines = True)

with open('log.txt') as f:
    f = f.readlines()

bad_lines = [int(x[0]) - 1 for x in f[0].split('line ')[1:]]

df_bad_lines = pd.read_csv('data.csv', skiprows = lambda x: x not in bad_lines, squeeze = True, header = None)

【讨论】:

  • 这可行,但我想保留导致错误的行并将值“Title|two”保留在单个列值中
  • 添加了单独读取坏行的选项
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多