error in CSV resetting with seek(0)

Peter Otten __peter__ at web.de
Sat May 2 00:52:25 EDT 2020


Rahul Gupta wrote:

> consider the following code
> import csv
> import numpy as np
> 
> with open("D:\PHD\obranking\\demo.csv", mode='r') as csv_file1,
> open("D:\PHD\obranking\\demo.csv", mode='r') as csv_file2:
>     csv_reader1 = csv.DictReader(csv_file1)
>     csv_reader2 = csv.DictReader(csv_file2)
> 
> 
>     filename = "cell_split_demo.csv"
>     with open("D:\PHD\obranking\\cell_split_demo.csv", 'w') as csvfilew1:
>         fields = (range(0, 300))
>         csvwriter1 = csv.DictWriter(csvfilew1, fieldnames=fields)
>         csvwriter1.writeheader()
> 
>         for i, row in enumerate(csv_reader1):
>             print(f"value_i({i}) label({row['label']})")
>             for j, line in enumerate(csv_reader2):
>                 if j <= i:
>                     matrixrows[j] = []
>                     if row['label'] != line['label']:
>                         print(f"value_j({j})Unequal
>                         label({line['label']})")
>                     else:
>                         print(f"value_j({j})   equal
>                         label({line['label']})") pass
>                 else:
>                     break
>             csv_file2.seek(0)
> Here is some of the out_put samples
> value_i(0) label(BW)
> value_j(0)   equal label(BW)
> value_i(1) label(BW)
> value_j(0)   Unequal label(label)
> value_j(1)   equal label(BW)
> value_i(2) label(BW)
> value_j(0)   Unequal label(label)
> value_j(1)   equal label(BW)
> value_j(2)   equal label(BW)
> You can see for j=0 while i goes from 1 to n it is not able to acess
> line['label'] value. Kindly help what is wrong with this?

Without looking closely I would guess that seek(0) causes the reader to 
mistake the header for a data row. If your data fits into memory you can do

rows = list(csv_reader1)
for i, outer_row in enumerate(rows):
   ...
   for j, inner_row in enumerate(rows):
       ...

With this aproach csv_reader2 is not needed at all.

If that fails for lack of memory build a new csv_reader2 on every iteration

csv_reader1 = csv.DictReader(csv_file1)
for i, outer_row in enumerate(csv_reader1):
    csv_reader2 = csv.DictReader(csv_file2)
    ...
    for j, inner_row in enumerate(csv_reader2)
       ...
    csv_file2.seek(0)



More information about the Python-list mailing list