databuffer + = data_str TypeError: может объединять только str (не "_io.TextIOWrapper") к str - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь анимировать свои данные, полученные с датчика LIDAR, но я получил эту ошибку при попытке анимировать их!Можете ли вы помочь этой проблеме, я новичок в программировании на Python, большое спасибо!

Это проблема, которую я получил:

Файл "C: \ Users \ cemal \AppData \ Local \ Programs \ Python \ Python37-32 \ veritipleriogrenme.py ", строка 29, в буфере анимированных данных + = data_str TypeError: может объединять только str (не" _io.TextIOWrapper ") в str

Это набор данных, который я пытаюсь оживить:

0.0,0.0
0.0,269.1
0.0,270.3
0.0,271.5
1617.8,265.6
1627.3,266.8
1629.0,268.0
1633.0,269.2

тип моего набора данных - строка!


import matplotlib.pyplot as plot
import math
from matplotlib import style
import matplotlib.animation as animation 
import numpy as np
fig=plot.figure(figsize=(4,4))
ax = fig.add_subplot(111, projection='polar')
ax.set_ylim(0,2000)
data = np.zeros(360)
theta = np.linspace(0,360, num=360)
l,  = ax.plot([],[])

databuffer = ""
uzaklik = np.zeros(360)
pol = np.linspace(0,360, num=360)
def animate(i):
    global data, databuffer
    data_str = open(r"C:\Users\cemal\OneDrive\Masaüstü\veri2.txt","r")
    databuffer +=  data_str
    aci=np.linspace(0,360, num=360)
    cap=np.zeros(360)
    p_pol=np.linspace(0,360, num=360)
    p_uzaklik=np.zeros(360)
    aci2=np.linspace(0,360, num=360)
    cap=np.zeros(360)
    for x in data_str:
        pol =x.partition(",")[2].rstrip()
        uzaklik =x.split(',')[0]
        try:

            p_pol=float(pol.strip().strip("'"))
            p_uzaklik=float(uzaklik.strip().strip("'"))

            aci=np.append(p_pol)
            cap=np.append(p_uzaklik)
            aci2=[math.radians(i) for i in aci]
            l.set_data(cap, aci2 )
            data_buffer=""

            return l, 

        except ValueError:
            continue

ani = animation.FuncAnimation(fig, animate,interval=10000)
plot.show()

1 Ответ

0 голосов
/ 27 марта 2019

open создает буферизованный считыватель .Есть много видов буферизованных читателей;в данном случае это читатель с текстовым буфером.Считыватель сам по себе не может рассматриваться как строка, НО, если вы скажете своему коду прочитать содержимое, вы получите тип данных, эквивалентный буферизованному читателю (байты из буферизованного читателя BytesIO и строка из TextIOWrapper)

Я бы немного прочитал о буферизованных считывателях, так как это определенно пригодится здесь

Этот код также демонстрирует, как вы можете использовать буферизованный считыватель для своихцели (с некоторыми изменениями в именах переменных для лучшего соответствия типу переменной):

data_buffer = ""
data_str_wrapper = open(r"C:\Users\cemal\OneDrive\Masaüstü\veri2.txt","r")
try:
    str += data_str_wrapper
except Exception as e:
    print("Can't combine strings and wrappers")
    print(e)
data_buffer += data_str_wrapper.read()
print("Now that i've read the buffer, I can treat it like a string")
print(data_buffer)

По сути, вам нужно, чтобы data_buffer добавил версию содержимого оболочки read , так чтоесть databuffer += data_str, вы действительно должны делать databuffer += data_str.read()

...