kejinatsu
kejinatsu

Reputation: 1

How to handle with TypeError in python?

I try to build data elimination code in python. In this script I try to apply some criteria to eliminate data file and save new data file with the imput that have defined value greater than 0.003 for example. Why do I get this error in these python script ? I added errors and script together. Which point that Ive failed ?

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import csv
import itertools
import math


def main():
    # ******
    f = open("deneme.csv", "r")
    reader = csv.reader(f)
    lines = itertools.islice(reader, 3, None, 5)

    n = open("results.csv", "wb")
    wr = csv.writer(n, quoting = csv.QUOTE_ALL)

    counter = 0
    line_count = 0

    for line in lines:
        line_count += 5

        w, h = 3, 3
        matrix = [[0 for x in range(w)] for y in range(h)]

        matrix[0][0] = float(line[1]) * (10 ** float(line[0]))
        matrix[0][1] = float(line[11]) * (10 ** float(line[0]))
        matrix[0][2] = float(line[9]) * (10 ** float(line[0]))
        matrix[1][0] = float(line[11]) * (10 ** float(line[0]))
        matrix[1][1] = float(line[3]) * (10 ** float(line[0]))
        matrix[1][2] = float(line[7]) * (10 ** float(line[0]))
        matrix[2][0] = float(line[9]) * (10 ** float(line[0]))
        matrix[2][1] = float(line[7]) * (10 ** float(line[0]))
        matrix[2][2] = float(line[5]) * (10 ** float(line[0]))

        trace = (matrix[0][0] + matrix[1][1] + matrix[2][2]) / 3

        norm = 0

        for i in range(3):
            for x in range(3):
                norm += matrix[i][x] * matrix[i][x]

        norm = math.sqrt(norm)

        if (trace / norm) > 0.0003:
            print(line_count - 4, line_count)

            # ******
            f = open("deneme.csv", "r")
            reader = csv.reader(f)
            rows = itertools.islice(reader, line_count - 5, line_count, None)

            for i in rows:
                print(i)
                wr.writerow(i)

            counter += 1

            print(line[0])
            print(matrix)
            print(trace)
            print(norm)
            print('buyuk')

            print('____________**********____________')

    print(counter)


if __name__ == "__main__":
    main()

Any advice for this case ? Thanks in advance. I also add csv files in here Error;

 Traceback (most recent call last):
      File "/Users/gokceoter/PycharmProjects/CMT/cmttt.py", line 74, in <module>
    21 25
    ['PDEW', '39083', '00:31:45.0', '1.23', '67.12', '10', '5.1', '5.4', 'CARLSBERG', 'RIDGE', '', '', '', '', '', '', '']
        main()
      File "/Users/gokceoter/PycharmProjects/CMT/cmttt.py", line 58, in main
        wr.writerow(i)
    TypeError: a bytes-like object is required, not 'str'

Upvotes: 0

Views: 50

Answers (1)

Adam Smith
Adam Smith

Reputation: 54163

You've opened the output file in binary mode

n = open("results.csv", "wb")  # <---------- the `b` here
wr = csv.writer(n, quoting = csv.QUOTE_ALL)

so writes to that file expect a bytes object not a str object. You can convert between the two with str.encode and bytes.decode.

for row in rows:  # why would you use `i` here? Don't.
    wr.writerow(row.encode())

Upvotes: 1

Related Questions