gpt4 book ai didi

python - 如何读取大文件(套接字编程和python)?

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:05 25 4
gpt4 key购买 nike

我是套接字编程和 Python 的初学者。我想学习如何将大文本文件(例如 > 5MB)从服务器发送到客户端。我不断收到一条错误消息

Traceback (most recent call last):
File "fserver.py", line 50, in <module>
reply = f.read()
ValueError: Mixing iteration and read methods would lose data

下面是我的部分代码。有人可以看一下并给我一些有关如何解决此问题的提示吗?感谢您的宝贵时间。

我的服务器.py

#validate filename
if os.path.exists(filename):
with open(filename) as f:
for line in f:
reply = f.read()
client.send(reply)
#f = open(filename, 'r')
#reply = f.read()
#client.send(piece)
else:
reply = 'File not found'
client.send(reply)

我的客户端.py

while True:
print 'Enter a command: list or get <filename>'
command = raw_input()
if command.strip() == 'quit':
break
client_socket.send(command)

data = client_socket.recv(socksize)
print data

最佳答案

这里的问题与套接字无关,也与文件有多大无关。当您这样做时:

for line in f:
reply = f.read()

for line in f 试图一次读取文件的一行,然后对于每一行,您都试图读取整个文件。那是行不通的。

如果你没有得到这个错误(在很多情况下你不会),第一次通过循环你会读取并忽略第一行,然后读取并发送除第一行之外的所有内容(或者,可能,除了第一个,例如 4KB 之外的所有内容都作为一个巨大的回复,然后循环将完成。

你想要的是其中之一:

for line in f:
reply = line

……或者……

# no for loop
reply = f.read()

与此同时,在您的客户端,您只执行一次 recv。这将获得第一个 4K(或 socksize 是什么)或更少,然后您将永远不会收到任何其他内容。

您需要的是一个循环。像这样:

while True:
data = client_socket.recv(socksize)
print data

但是现在你有一个新问题。文件完成后,客户端将永远坐在那里等待下一个永远不会到来的数据 block 。所以客户需要知道它什么时候完成。它知道的唯一方法是服务器是否将该信息放入数据流中。

一种方法是在文件之前发送长度。一种标准化的方法是使用 netstring协议(protocol)。你可以找到为你做这件事的图书馆,但它很简单,可以手工完成。或者做一些更像 HTTP 的事情,其中​​ header 仅由换行符分隔,并由空行与正文分隔;然后你可以使用 socket.makefile 作为你的协议(protocol)实现。或者甚至是二进制协议(protocol),您只需将长度作为四个字节发送。

我们在这里还可以解决另一个问题:send(reply) 不一定发送整个回复;它发送从 1 个字节到整个东西的任何地方,并返回一个数字告诉你发送了什么。对此的简单解决方法是使用 sendall(reply),它保证发送所有回复。

最后:您的服务器期望每个 recv 将恰好收到一个由 send 发送的命令。但是套接字不是那样工作的。 Sockets are byte streams, not message streams ;没有什么可以阻止 recv 获取,比方说,只有半个命令,然后你的服务器就会崩溃。所以,你也需要某种朝这个方向发展的协议(protocol)。同样,您可以使用 netstring、换行符分隔的消息或二进制长度前缀,但您必须做些什么

(上面链接的博文有使用二进制长度前缀作为协议(protocol)的非常简单的示例代码。)

关于python - 如何读取大文件(套接字编程和python)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19990974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com