我的场景:我正在读取一个 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/