0

私は Python を初めて使用し、ソケットを使用してプログラムを実行する必要があります。私のサーバーは、ソケットを使用してデータをクライアントに送信する必要があります。ファイルの名前とそのサイズを簡単に指定します。

そこで、TCP サーバー クラスを使用して、次の形式でデータを送信します。

for fname, size in db.getfiles():
  temp = fname + " " + size + " "
  buffer = buffer + temp

self.request.send(buffer)

だから私は送信する長い文字列を持っています。

クライアントで受け取り、使用したい:

 List = data.split(" ")

しかし、名前とファイルを 1 つのループで出力できる並列配列のように List を使用したいのですが、次のようにします。

 for name, f_size in List:
      print name, f_name

どうすればこれを行うことができますか?同じリスト内でこれを行うことができない場合、この方法で印刷できるようにリストを再度分割するにはどうすればよいですか?

これができない場合、リスト内の 2 つのインデックスごとにジャンプして、両方を同時に印刷するにはどうすればよいですか?

例えば:

 for i in List:
     print i, i + 1
     #jump now to index 2

ありがとう!

4

3 に答える 3

0

現在のメッセージ形式の問題は、2 つのデータ値 (fnamesize) の間、およびデータの別々の項目 (つまり、異なるファイルの名前とサイズ) の間で同じ区切り文字を使用していることです。ペアで値を取得することは可能ですが、必要と思われるよりも少し手間がかかります。代わりに、2 つの異なる区切り文字を使用することをお勧めします。

たとえば、現在挿入して"\n"いるスペースの代わりに、サイズの後に改行文字 ( ) を挿入することで、各ファイルの情報を個別の行に送信できます。次に、読み取り側で、2 つの 2 つのsplit操作が必要になるため、リストのリストが得られます。

raw_data = some_socket_read_function()
data = [line.split(" ") for line in raw_data.split("\n")]

for fname, size in data: # you can unpack the two values directly while iterating
    do_stuff(fname, size)

改行を使用したくない場合は、データ内の 2 種類の区切りを区別するために使用できる他のあらゆる種類の文字 (コンマ、コロンなど) があります。

于 2012-12-14T04:15:17.590 に答える
0

他の 2 つの回答は正しく、データを別の形式で送信する方がクリーンです。ただし、何らかの理由で受信しているデータの形式を変更できない場合は、これを行うことができます

List = data.split(" ")
List = zip(List[::2], List[1::2])

for name, size in List:
  # do something with name and size

このzip関数はペアのリストを作成し、2 つのリストの対応する要素から各ペアを形成します。を返しzip([1,2,3], [4,5,6])ます[(1,4), (2,5), (3,6)]。では、要素 0 から始まる 1 つおきの要素をList[::2]返し、では要素 1 から始まる 1 つおきの要素を返します。ListList[1::2]List

于 2012-12-14T04:25:59.120 に答える
0

リストをネットワーク経由で送信するときにリストをシリアル化し、反対側でシリアル化を解除する必要があります。したがって、送信側では次のようになります。

import pickle

list = db.getfiles()
self.request.send(pickle.dumps(list))

そして受信側では:

import pickle
List = pickle.loads(data)

シリアライゼーションはデータ構造を転送または保存に適した形式に変換し、アンシリアライゼーションはエンコードされたデータを元のデータ構造に変換します。このようにすると、送信側のタプルのリストから始まり (これが から得られるものであると仮定しますdb.getfiles())、受信側のタプルのリストで終わります。

モジュールは、pickleシリアル化に使用できる唯一のメカニズムではありません。その他の一般的なシリアル化形式には、JSON (jsonモジュール経由)、YAML、XML などがあります。

于 2012-12-14T04:00:05.740 に答える