2013-10-02 36 views
-1

对不起,我真的是新来的..下面是完整的python脚本。UnicodeEncodeError:'ascii'

该脚本的目的是读取两个不同的1线温度传感器,然后使用HTTP POST将这些值写入MySQL数据库。

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import requests 
import hashlib 
import time 

#Dont forget to fill in PASSWORD and URL TO saveTemp (twice) in this file 

sensorids = ["28-00000", "28-000004"] 
avgtemperatures = [] 
for sensor in range(len(sensorids)): 
    temperatures = [] 
    for polltime in range(0,3): 
      text = ''; 
      while text.split("\n")[0].find("YES") == -1: 
        # Open the file that we viewed earlier so that python can see what   is in it. Replace the serial number as before. 
        tfile = open("/sys/bus/w1/devices/"+ sensorids[sensor] +"/w1_slave") 
        # Read all of the text in the file. 
        text = tfile.read() 
        # Close the file now that the text has been read. 
        tfile.close() 
        time.sleep(1) 

      # Split the text with new lines (\n) and select the second line. 
      secondline = text.split("\n")[1] 
      # Split the line into words, referring to the spaces, and select the 10th word (counting from 0). 
      temperaturedata = secondline.split(" ")[9] 
      # The first two characters are "t=", so get rid of those and convert the temperature from a string to a number. 
      temperature = float(temperaturedata[2:]) 
      # Put the decimal point in the right place and display it. 
      temperatures.append(temperature/1000 * 9.0/5.0 + 32.0) 

    avgtemperatures.append(sum(temperatures)/float(len(temperatures))) 

print avgtemperatures[0] 
print avgtemperatures[1] 

session = requests.Session() 
# Getting a fresh nonce which we will use in the authentication step. 
nonce = session.get(url='http://127.0.0.1/temp/saveTemp.php?step=nonce').text 

# Hashing the nonce, the password and the temperature values (to provide some integrity). 
response = hashlib.sha256('{}PASSWORD{}{}'.format(nonce.encode('utf8'), *avgtemperatures).hexdigest()) 

# Post data of the two temperature values and the authentication response. 
post_data = {'response':response, 'temp1':avgtemperatures[0], 'temp2': avgtemperatures[1]} 

post_request = session.post(url='http://127.0.0.1/temp/saveTemp.php', data=post_data) 

if post_request.status_code == 200 : 
    print post_request.text 

下面是我得到的新错误。

Traceback (most recent call last): 
File "/var/www/pollSensors.py", line 42, in <module> 
response = hashlib.sha256('{}PASSWORD{}{}'.format(nonce.encode('utf8'), *avgtemperatures).hexdigest()) 
AttributeError: 'str' object has no attribute 'hexdigest' 
+3

什么是“nonce”和“avgtemperatures”?请给我们一些我们可以重现您的问题。 –

+0

你的问题完全独立于MySQL。 –

+0

我将完整的脚本添加到原始文章。 – user2782497

回答

1

nonce是unicode值; session.get(..).text总是unicode。

您试图强制将该值强制为字符串而不明确提供编码。因此,Python正在尝试使用默认的ASCII编解码器为您编码。该编码失败。

改为将Unicode值明确地编码为字符串。对于SHA 256哈希,UTF-8可能没问题。

response = hashlib.sha256(nonce.encode('utf8') + 'PASSWORD' + 
          str(avgtemperatures[0]) + 
          str(avgtemperatures[1])).hexdigest() 

或使用字符串模板:

response = hashlib.sha256('{}PASSWORD{}{}'.format(
    nonce.encode('utf8'), *avgtemperatures)).hexdigest() 
+0

我添加下面的下面的python脚本和错误的改变顶部.. #在/ usr/bin中/ Python的 # - * - 编码:UTF-8 - * - 新的错误: 回溯(最近呼叫最后): 响应=(nonce +'PASSWORD'+ str(avgtemperatures [0])+ str(avgtemperatures [1]))的文件“/var/www/pollSensors.py”,第42行,在 。 hexdigest() AttributeError:'unicode'对象没有属性'hexdigest' – user2782497

+0

@ user2782497:编码标题不是原因,也不是。你在那里删除了'hashlib.sha256'。 –

+0

我更新了原帖,显示更新的代码和新的错误..至少错误在改变! – user2782497

0

我得到了类似的问题,但它是小数,而不是ascci

删除目录:您-profile.spyder2 \ spyder.lock