bugfix> arrays > 投稿

サーバーからクライアントにリストを送信しようとしています。 リストは次のようになります(csvファイルです)。

201,8,0040000080
205,8,1f421d25721e

しかし、送信するとこのエラーが発生します:

TypeError: must be string or buffer, not lis t

私は2つのオプションを試しました:

  1. リストを反復処理し、各文字列をサーバーに送信しますが、結果は次のとおりです。

    201 ---> 2,0,1

  2. 各行、たとえばstr(line)をキャストして送信してみましたが、次のようになりました:

    201,8,0040000080 ---> [、 '、2,0,1、'、 "、"、、 '、8、'、 "、"、、 '、0,0,4,0,0,0,0,0,8,0、 '、]

どうすればこれを解決できますか?クライアントからサーバーにデータをそのまま送信したいだけです。レコードの場合、クライアントコード:

   import socket
    import csv
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    with open('can_data.csv', 'rb') as csv_file:
        csv_reader = csv.reader(csv_file)
        for line in csv_reader:
                clientSock.sendto(str(line), (self.address, self.port))

サーバーコード:

     with open('output.csv', 'wb') as new_file:
        csv_writer = csv.writer(new_file)
        while True:
            data, addr = s.recvfrom(1024)
            csv_writer.writerow(data)

回答 1 件
  • 両側がシリアル化形式に同意する必要があります。 str(line)   ast.literaleval() と組み合わせた場合に機能する場合があります  しかし、 repr(line)   repr としてより良い選択でしょう   str より正確な表現を試みます 。 pickle のようなシリアル化プロトコルに移行することもできます  または json

    これがpython 3であると仮定して、csvをテキストに移動し、ワイヤーでutf-8エンコードを使用しました。

    クライアント:

    import socket
    import csv
    address = 'localhost'
    port = 5555
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    with open('can_data.csv', 'r') as csv_file:
        csv_reader = csv.reader(csv_file)
        for line in csv_reader:
            clientSock.sendto(repr(line).encode('utf-8'), (address, port))
    
    

    サーバ:

    import socket
    import csv
    import ast
    address = 'localhost'
    port = 5555
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind((address, port))
    with open('output.csv', 'w') as new_file:
        csv_writer = csv.writer(new_file)
        while True:
            data, addr = sock.recvfrom(1024)
            csv_writer.writerow(ast.literal_eval(data.decode('utf-8')))
    
    

あなたの答え