python - 在 Python 中从 csv 中读取原始行和字典

标签 python csv

我的场景:我正在读取一个 csv 文件。我想访问每行生成的字段的字典,以及原始的、未解析的行。

最终目标是对字段进行一些处理,使用结果来决定我感兴趣的行,并将这些行仅写入输出文件。

一个简单的解决方案,涉及读取文件两次,如下所示:

def dict_and_row(filename):
    with open(filename) as f:
        tmp = [row for row in DictReader(f)]

    with open(filename) as f:
        next(f)    # skip header
        for i, line in enumerate(f):
            if len(line.strip()) > 0:
                yield line.strip(), tmp[i]

有更好的建议吗?

编辑:更具体的使用场景。我打算通过 dict 中的一些数据对行进行索引,然后使用该索引来查找我感兴趣的行。类似于:

d = {}
for raw, parsed in dict_and_row(somefile):
      d[(parsed["SOMEFIELD"], parsed ["ANOTHERFIELD"])] = raw

然后是

for pair in some_other_source_of_pairs:
      if pair in d:
            output.write(d[pair])

最佳答案

我最终用一个保存最后一行读取的对象包装文件,并将该对象传递给 DictReader。

class FileWrapper:
  def __init__(self, f):
    self.f = f
    self.last_line = None

  def __iter__(self):
    return self

  def __next__(self):
    self.last_line = next(self.f)
    return self.last_line

然后可以这样使用:

  f = FileWrapper(file_object)
  for row in csv.DictReader(f):
      print(row)   # that's the dict
      print(f.last_line)   # that's the line

或者我可以实现dict_and_row:

 def dict_and_row(filename):
    with open(filename) as f:
         wrapper = FileWrapper(f)
         reader = DictReader(wrapper)
         for row in reader:
              yield row, wrapper.last_line 

这还允许访问其他属性,例如读取的字符数。

不确定这是最好的解决方案,但它确实具有保留对字符串的访问权的优势,因为它们最初是从文件中读取的。

关于python - 在 Python 中从 csv 中读取原始行和字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971718/

相关文章:

python - python 中的 sklearn `MemoryError`

python - 如果满足条件,则根据另一个数据框中的匹配项更新数据框

perl - 如何从 Text::CSV utf8 输出?

java - 上传 zip 文件,解压并读取文件

python - 在 Tensorflow 中,我是否需要为 "sinc"或 "gaussian"激活函数添加新的操作?

python - 在 python 中使用时区获取当前时间?

powershell - 使用 powershell 右连接 csv 文件中的列

java - H2数据库可以查询包含不同记录组的多个部分的CSV文件吗?

用于输出到 csv 的 java 库 - 将数据输出到 csv 格式需要处理哪些特殊情况

Python - 解析 json 输出到 CSV