例如我有一个像这样的 CSV 文件:
a,b,c
a1,b1,c1
我想获取解析后的数据和原始的原始 CSV 行。例如:
import csv
with open('some.csv') as f:
reader = csv.reader(f)
for row in reader:
# getting original raw csv line
print(row)
print(origin_row)
# should print something like this:
# ["a", "b", "c"]
# a,b,c
CSV 数据可以包含任何可能的数据。 我需要它来存储解析的行和原始行以进行验证/验证/等。我需要每行/实体都有解析的数据和原始数据。
itertools.tee
。
但是,如果值可以包含换行符,则此方法将不起作用 - 因此一个 CSV 行位于文件中的多行上。
import csv
from itertools import tee
with open("data.csv", "r") as f:
f1, f2 = tee(f)
for row, original_row in zip(csv.reader(f1), f2):
# getting origin raw csv line
print(row, original_row)
打印:
['a', 'b', 'c'] a,b,c
['a1', 'b1', 'c1'] a1,b1,c1
就我而言,我在计算机上创建了一个 test.csv 并为其指定了几行:
import csv
import itertools
with open('test.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
origin_row = ','.join(row)
parsed_data = list(zip(itertools.count(), row))
print("Original Row:", origin_row)
print("Parsed Data:", parsed_data)
输出:
Original Row: a,b,c
Parsed Data: [(0, 'a'), (1, 'b'), (2, 'c')]
Original Row: a1,b1,c1
Parsed Data: [(0, 'a1'), (1, 'b1'), (2, 'c1')]
Original Row: d1,e1,f1
Parsed Data: [(0, 'd1'), (1, 'e1'), (2, 'f1’)]
OP 从未定义“解析数据”是什么样子。在此示例中,它是一个元组列表。但它很容易是一本字典或其他东西。
您的问题并没有真正明确定义,因为在您实际解析它之前,您无法知道一个 CSV 行可能包含文字换行符时对应多少行原始数据。
这是一个饱受折磨的草图,它使用两个打开的文件句柄在解析后分别读取原始数据。
import csv
def rawcsv(filename):
with open(filename, "r") as csvdata, open(
filename, "rb") as rawdata:
reader = csv.reader(csvdata)
prev = 0
for row in reader:
# Where is the file pointer now?
pos = reader.line_num
# Read the same amount of rawdata
raw = b"".join([rawdata.readline() for _ in range(pos - prev)])
prev = pos
yield raw, row
for raw, row in rawcsv("some.csv"):
print(f"Raw: {raw}")
print(f"Row: {row}")
(您需要将其保留在函数中才能使
yield
有意义。)
注意
raw
将是一个 bytes
对象。