【问题标题】:csv reading the old waycsv读取旧方式
【发布时间】:2017-03-14 11:14:35
【问题描述】:

我完全了解如何以正常方式使用 Python 读取 csv 文件。我也知道我可以解析列表(例如["a, b, 123"])。由于生成器和产量,两者都可以工作。

我的问题略有不同:

  • 输入是dict,如{"line": "a, b, 123", "line_count": 555, ..}
  • 输出应该是相同的dict 扩展了"csv" 属性,如
    {"line": "a, b, 123", "line_count": 555, .., "csv": ["a", "b", "c"]}

最简单且非常传统的方法是(伪代码):

def my_csv_reader(myconfig):
    my_reader = CsvReader(**myconfig)
    for line in some_gen_providing_the_list_of_dicts:
        line["csv"] = csv.reader(line["line"])  (1)
        yield line

我实际上可以通过将标记为 (1) 的行替换为:

line["csv"] = csv.reader([line["line"]], **myconfig)  (1)

但我需要解析 500 行 mio,并且为每一行创建和初始化 CSV 对象可能会产生大量垃圾,实际上是不必要的。我也不喜欢那些标题行,DictReader 等将不再是内置的。如果我能做到:

  • 创建一个 csv reader 对象。
  • 调用一个无聊的老式 to_csv(my_line) 函数,返回该行的 csv。

这在 Python 3.x 中是否可行?

【问题讨论】:

  • 不,传统的方法是从可迭代的行(如文件对象)中制作 CSV 阅读器,而不是为每一行制作单独的阅读器。

标签: python python-3.x csv


【解决方案1】:

你是这个意思吗?

def to_csv(s):
  s = s.split(',')
  s = [t.strip() for t in s]
  return s

def csv_reader(dicts):
  for d in dicts:
    d['csv'] = to_csv(d['line'])
    yield d

【讨论】:

  • 您的解决方案在哪里支持标题、DictReader、方言等?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2017-06-29
  • 2011-06-18
  • 2019-07-16
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多