Home > Software engineering >  How to read a csv file into a multidimensional list in Python
How to read a csv file into a multidimensional list in Python

Time:11-18

I'm trying to read a csv file into a multidimensional list with 52 rows and 7 columns. Currently it's only displaying me the last line as 52 rows of the csv file.

I am pretty sure there is something wrong in my readfile function but I couldn't figure it out where I'm making the mistake.

Here is my code:

rows = 52
cols = 7

def readFile():

  matrix = []

  file = open("rainfall.csv","r")
  for line in file:
    data = line.split(",")

  for row in range(rows):
    matrix.append([])
    for col in range(cols):
        matrix[row].append(data[col])
  
  return matrix
      
def display(matrix):
  for counter in matrix:
    for values in counter:
      print(values, end=" ")
    print()

matrix = readFile()
display(matrix)

Here is the output:

8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0 
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0
8 25 1 6 21 23 0

I have the following csv file:

0,0,30,2,21,13,23
29,3,29,30,7,8,25
26,5,26,13,4,13,4
22,30,13,15,15,0,2
3,12,11,10,17,0,15
8,13,11,24,30,24,27
22,18,2,29,11,13,18
15,1,29,23,18,7,0
23,27,3,7,13,14,28
6,25,24,14,20,23,5
24,29,26,22,0,9,18
22,27,22,20,24,29,21
23,13,14,4,13,1,21
25,21,21,6,28,17,19
4,6,11,10,21,1,5
11,7,22,11,10,24,15
25,11,23,3,23,8,3
22,23,0,29,15,12,5
21,11,18,22,1,4,3
11,10,3,1,30,14,22
2,16,10,2,12,9,9
2,29,17,16,13,18,7
22,15,27,19,6,26,11
21,7,18,4,14,14,2
6,30,12,4,26,22,11
21,16,14,11,28,20,3
19,10,22,18,30,9,27
8,15,17,4,11,16,6
19,17,16,6,18,18,6
2,15,3,25,27,16,11
15,5,26,24,24,30,5
15,11,16,22,14,23,28
25,6,7,20,26,18,16
5,5,21,22,24,16,5
6,27,11,8,24,1,16
28,4,1,4,3,19,24
19,3,27,14,12,24,0
6,3,26,15,15,22,26
18,5,0,14,15,7,26
10,5,12,22,8,7,11
11,1,18,29,6,9,26
3,23,2,21,29,15,25
5,7,1,6,15,18,24
28,11,0,6,28,11,26
4,28,9,24,11,13,2
6,2,14,18,20,21,1
20,29,22,21,11,14,20
28,23,14,17,25,3,18
6,27,6,20,19,5,24
25,3,27,22,7,12,21
12,22,8,7,0,11,8
8,25,1,6,21,23,0

CodePudding user response:

Use the built-in csv module:

import csv
from pprint import pprint

with open('input.csv', newline='') as f:
    reader = csv.reader(f)
    data = [[int(x) for x in line] for line in reader]

pprint(data)

Output:

[[0, 0, 30, 2, 21, 13, 23],
 [29, 3, 29, 30, 7, 8, 25],
 [26, 5, 26, 13, 4, 13, 4],
 [22, 30, 13, 15, 15, 0, 2],
 [3, 12, 11, 10, 17, 0, 15],
 [8, 13, 11, 24, 30, 24, 27],
 [22, 18, 2, 29, 11, 13, 18],
 [15, 1, 29, 23, 18, 7, 0],
 [23, 27, 3, 7, 13, 14, 28],
 [6, 25, 24, 14, 20, 23, 5],
 [24, 29, 26, 22, 0, 9, 18],
 [22, 27, 22, 20, 24, 29, 21],
 [23, 13, 14, 4, 13, 1, 21],
 [25, 21, 21, 6, 28, 17, 19],
 [4, 6, 11, 10, 21, 1, 5],
 [11, 7, 22, 11, 10, 24, 15],
 [25, 11, 23, 3, 23, 8, 3],
 [22, 23, 0, 29, 15, 12, 5],
 [21, 11, 18, 22, 1, 4, 3],
 [11, 10, 3, 1, 30, 14, 22],
 [2, 16, 10, 2, 12, 9, 9],
 [2, 29, 17, 16, 13, 18, 7],
 [22, 15, 27, 19, 6, 26, 11],
 [21, 7, 18, 4, 14, 14, 2],
 [6, 30, 12, 4, 26, 22, 11],
 [21, 16, 14, 11, 28, 20, 3],
 [19, 10, 22, 18, 30, 9, 27],
 [8, 15, 17, 4, 11, 16, 6],
 [19, 17, 16, 6, 18, 18, 6],
 [2, 15, 3, 25, 27, 16, 11],
 [15, 5, 26, 24, 24, 30, 5],
 [15, 11, 16, 22, 14, 23, 28],
 [25, 6, 7, 20, 26, 18, 16],
 [5, 5, 21, 22, 24, 16, 5],
 [6, 27, 11, 8, 24, 1, 16],
 [28, 4, 1, 4, 3, 19, 24],
 [19, 3, 27, 14, 12, 24, 0],
 [6, 3, 26, 15, 15, 22, 26],
 [18, 5, 0, 14, 15, 7, 26],
 [10, 5, 12, 22, 8, 7, 11],
 [11, 1, 18, 29, 6, 9, 26],
 [3, 23, 2, 21, 29, 15, 25],
 [5, 7, 1, 6, 15, 18, 24],
 [28, 11, 0, 6, 28, 11, 26],
 [4, 28, 9, 24, 11, 13, 2],
 [6, 2, 14, 18, 20, 21, 1],
 [20, 29, 22, 21, 11, 14, 20],
 [28, 23, 14, 17, 25, 3, 18],
 [6, 27, 6, 20, 19, 5, 24],
 [25, 3, 27, 22, 7, 12, 21],
 [12, 22, 8, 7, 0, 11, 8],
 [8, 25, 1, 6, 21, 23, 0]]

CodePudding user response:

Change

 for line in file:
    data = line.split(",")

to:

 data=[]
 for line in file:
    data.append(line.split(","))

CodePudding user response:

Please use the stdlib's csv module for this. It is designed for this exact purpose. Also, use the with statement for opening files. It will handle closing the file for you, even in the case that an exception is raised.

import csv

def readFile():
    with open("rainfall.csv","r") as f:
        matrix = list(csv.reader(f))
    return matrix

CodePudding user response:

Just on 4 lines:

#Read data file
with open('rainfall.csv', 'r') as f:
  lst = [[int(num) for num in line.split(',')] for line in f]

#Display result
for i in lst:
  print(*i)
  • Related