0

我是 Python 新手,我需要用套接字做一个程序。我的服务器需要使用套接字向客户端发送数据。它简单地给出了一个文件的名称和他的大小。

因此,我使用 TCP Server 类以以下格式发送数据:

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

self.request.send(buffer)

所以我有一个很长的字符串要发送。

我在客户端收到它,我想使用:

 List = data.split(" ")

但是我想像并行数组一样使用 List ,我可以在一个循环中打印名称和文件,我想要:

 for name, f_size in List:
      print name, f_name

我怎么能做到这一点?如果我不能在同一个列表中执行此操作,我如何再次拆分列表以便以这种方式打印?

如果无法做到这一点,我如何跳转列表中的每两个索引,以便我可以同时打印这两个东西?

例如:

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

谢谢!

4

3 回答 3

0

当前消息格式的问题在于,您在两个数据值(fnamesize)之间以及单独的数据项(即不同文件的名称和大小)之间使用了相同的分隔符。虽然可以成对获取值,但它需要比我认为必要的更多的努力。相反,我建议使用两个不同的分隔符。

例如,您可以将每个文件的信息放在单独的行上,方法是在大小之后放置一个换行符 ( "\n"),而不是当前放置的空间。然后在阅读结束时,您将需要两个两个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)

如果您不想使用换行符,您可以使用各种其他字符(逗号、冒号等)来区分数据中的两种分隔符。

于 2012-12-14T04:15:17.590 回答
0

其他两个答案是正确的,以另一种格式发送数据会更干净。但是,如果由于某种原因您无法更改所接收数据的格式,您可以这样做

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

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

zip函数创建一个对列表,从两个列表中的相应元素形成每个对。所以zip([1,2,3], [4,5,6])返回[(1,4), (2,5), (3,6)]List[::2]返回 中的每个第二个元素List,从元素 0 开始,并List[1::2]返回List从元素 1 开始的每个第二个元素。

于 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 回答