【问题标题】:How to sanitize CSV input with one-space strings?如何使用一个空格字符串清理 CSV 输入?
【发布时间】:2015-12-06 00:30:06
【问题描述】:

所以情况是这样的:

  • 我正在读取 CSV 文件,其中大部分时间,空单元格只是空字符串。无论出于何种原因,同一组中的某些文件在“空单元格”中包含一个空格字符串,而不是空字符串。

  • 我正在使用csv 的 DictReader 从这些文件中读取数据(以 ',' 作为分隔符),它会在我将空字符串插入到PostgreSQL 数据库。

  • 我尝试注册一个设置skipinitialspace=True 的方言对象,但现在它们仍然是空字符串,与None 不同,对于我设置为整数值的 SQL 表列仍然是无效输入(所以我我猜 DictReader 在删除前导空格之前会将空字符串转换为 None

我该如何解决这个问题?

免责声明:我可以通过在读取值并从 DictReader 获得行的 dict 后自己将所有一个空格字符串转换为 None 类型来获得解决方案,但它看起来很笨重,我更喜欢如果可能的话,更优雅的解决方案。

普通 csv 示例

foo_id,foo_text,foo_value
1,'hello',4
3,,2

示例问题 csv

bar_id,bar_text,bar_value
1,'hello',4
3, ,2

csv 读取脚本示例

with open('foo.txt') as csv_file:
    csv.register_dialect('example_dialect', delimiter=',', skipinitialspace=True)
    gtfsreader = DictReader(csv_file, dialect='example_dialect')
    for row in gtfsreader:
        print(row)

【问题讨论】:

  • 如果您发布您正在使用的代码的相关部分,这可能会有所帮助。通常需要一个相当小的 runnable 示例,因此 csv 文件的一部分也很方便。
  • 好提示,添加了一些代码
  • 我认为最好的选择是手动将 " " 值替换为 None 的笨重选项。如果你愿意,你可以创建一个csv.Reader 的子类,它在幕后处理这个问题,但无论你是否隐藏它,你都会做同样的事情。我真的不认为这个建议值得回答。希望其他人可以提供更多帮助!

标签: python csv python-3.x


【解决方案1】:

从来没有想出一种方法来配置 DictReader 来为我做这件事,但与此同时,我确实只是用这个辅助函数手动清理了每一行:

def __sanitize__(row):
  for key, value in row.items():
    if value in ('', ' '):
      row[key] = None
  return row

还是希望有人能给出更性感的答案!

【讨论】:

    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多