0

免责声明:我是一个完全的 Python n00b,从来没有用 Python 写过任何东西,我已经多年没有编程过任何东西,我最后学习的语言是 Visual Basic 6。所以请耐心等待!

所以我有一个 Android 应用程序,它通过 UDP 将我手机的传感器(加速度计、磁铁、光等)数据传输到我的 Windows PC,我有一个 Python 3.3 脚本来在屏幕上显示该数据,并将其写入 CSV:

#include libraries n stuff
import socket
import traceback
import csv

#assign variables n stuff
host = ''
port = 5555
csvf = 'accelerometer.csv'

#do UDP stuff
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((host, port))

#do CSV stuff
with open(csvf, 'w', newline='', encoding='ascii') as csv_handle:
    csv_writer = csv.writer(csv_handle, delimiter=',')
    while 1:
        try:
            message, address = s.recvfrom(8192) 
            print(message)                      #display data on screen
            csv_writer.writerow(message)        #write data to CSV
        except(KeyboardInterrupt, SystemExit):  
            raise
        except:
            traceback.print_exc()               

屏幕上的数据看起来像这样,这是正确的:

b'7407.75961, 3, 0.865, 1.423, 9.022, 5,

CSV 文件中的数据看起来像数据的 ASCII 代码的数值(注意:代码与上面不匹配,因为数据略有不同):

57,48,48,50,46,54,51,57,57,57,44,32,51,44,32,32,32,48,46,53,52,57,44,32,32,53,46,54,56,56,44,32,32,56,46,51,53,53

我怎样才能让我的 CSV 只写 UDP 套接字正在接收的字符串?如您所见,我尝试添加“encoding='ascii'”,但这与省略它并没有什么区别。

4

2 回答 2

0

尝试:

csv_writer.writerow([message])

csv_writer.writerow期望一个可迭代的作为它的第一个参数,这将是一个逗号分隔值的列表。在您的示例中,消息是一个字符串,它是可迭代的,因此 csv_writer 将每个字符写入单独的逗号分隔值。

于 2013-07-09T21:42:19.057 回答
0

writerow需要一个序列或可迭代的值。但是你只有一个值。

它有点工作但做错事的原因是你的一个值 - 一个bytes字符串 - 实际上本身就是一个序列。但这不是逗号分隔值的序列,而是字节序列。

那么,如何获得一系列单独的值?


一种选择是使用split. 要么 要么message.split(b', ')map(str.strip, message.split(b','))这里似乎是合理的。这会给你这个序列:

[b'7407.75961', b'3', b'0.865', b'1.423', b'9.022', b'5']

但实际上,这正是该csv模块的用途。例如,您可以将输入包装在 a 中BytesIO并将其传递给 a csv.reader,然后您只需将行从中复制readerwriter.


但是如果你仔细想想,你得到的数据是csv格式的,你想用完全相同的csv格式写出来,而不是以任何其他方式使用它……所以你甚至不需要这里的csv模块。只需使用一个普通的旧二进制文件:

with open(csvf, 'wb') as csv_handle:
    while True:
        try:
            message, address = s.recvfrom(8192) 
            print(message)                      #display data on screen
            csv_handle.write(message + b'\n')
        except(KeyboardInterrupt, SystemExit): 
            raise
        except:
            traceback.print_exc()

当我们这样做时,您几乎不需要这样做:

except(KeyboardInterrupt, SystemExit): 
    raise
except:
    traceback.print_exc()

Python 3.x 中唯一不继承自的异常ExceptionKeyboardInterrupt, SystemExit(在此处不会发生),以及任何特意表现得像andGeneratorExit的第三方异常。所以,只需这样做:KeyboardInterruptSystemExit

except Exception:
    traceback.print_exc()
于 2013-07-09T22:38:47.860 回答