如何从文件中获取原始的原始 CSV 行

问题描述 投票:0回答:3

例如我有一个像这样的 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 数据可以包含任何可能的数据。 我需要它来存储解析的行和原始行以进行验证/验证/等。我需要每行/实体都有解析的数据和原始数据。

python csv
3个回答
0
投票

一种可能的解决方案是使用

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


0
投票

就我而言,我在计算机上创建了一个 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 从未定义“解析数据”是什么样子。在此示例中,它是一个元组列表。但它很容易是一本字典或其他东西。


0
投票

您的问题并没有真正明确定义,因为在您实际解析它之前,您无法知道一个 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
对象。

演示:https://ideone.com/iqBQf0

© www.soinside.com 2019 - 2024. All rights reserved.