I am new to Python 3. Currently, I am working on a project that requires ne to go through a csv file (without using the csv modules) and extract numbers. While I have been able
replace
doesn't work in-place. Instead it returns a string with the replacement done. Hence, for fix #1 you should change your statement from:
row[i].replace("\\n", " ")
to:
row[i] = row[i].replace("\\n", " ")
However, the bigger problem is the iteration over the list obtained from the .split(",")
operation.
In fact, your iteration runs short of 1 element, hence never touches the last item, and thus never removes the \n
. Let's do some math:
row = ['13.9', ' 5.2', ' 3.4\n']
# len(row) == 3
# len(row) - 1 == 2
# range(len(row) - 1) == [0 1], which will do 2 iterations instead of 3
So, fix #2 would be to correct that for
loop, which should look something like:
for row in open(filename):
row = row.split(",")
for i in range(len(row)): # notice the absence of -1
row[i] = row[i].replace("\n", "")
row[i] = float(row[i])
lines.append(row)
Since every line of a CSV file has an ending \n
, you might as well strip it before you split the columns and perform the conversion str
to float
via map, like this:
lines = []
for row in open(filename):
row = row.strip().split(",") # first remove the "\n" then split
row = list(map(float, row)) # [13.9, 5.2, 3.4]
lines.append(row)
Strings are immutable in Python, so you will need to always assign row[i]
back to the modified version of itself:
for row in open(filename):
row = row.split(",")
for i in range(len(row) - 1):
row[i] = row[i].replace("\n", "") # CHANGE HERE
row[i] = float(row[i])
lines.append(row)
Note: You don't need to double escape the backslash in \n
when using regular string replace.