gpt4 book ai didi

python - (Python)得到最大的递归错误,在这种情况下我应该尝试其他方法还是重写它?

转载 作者:行者123 更新时间:2023-12-03 11:58:42 25 4
gpt4 key购买 nike

我正在使用递归从套接字写入文件,并且可以看到为什么我遇到了最大递归错误。我的问题是,我应该忽略它吗?
这是所需的行为:

  • 对于第一个数据块,覆盖或创建一个以“wb”模式打开的文件。对于每个剩余的数据块,追加。如果我不这样做,则在“ab”模式下会将数据追加到现有文件中,或者在“wb”模式下仅将每个块写入其自己的文件中。

  • 这是我的解决方案:
    def write_file(path:str, client_socket:socket, recv_len: int = 1, open_mode: str = "wb"):
    if recv_len:
    data = client_socket.recv(BUFFER_LEN)
    recv_len = len(data)

    with open(path, open_mode) as f:
    f.write(data)

    if recv_len < BUFFER_LEN:
    client_socket.send("File successfully transfered.")
    return
    else:
    write_file(path, client_socket, recv_len, "ab")
    这是我以前不太优雅的解决方案,也可以使用:
    def download(path, client_socket):
    while True:
    file_buffer = b""
    recv_len = 1


    try:
    while recv_len:
    data = client_socket.recv(BUFFER_LEN)
    recv_len = len(data)

    # Overwrite file if exists.
    with open(path, 'wb') as f:
    f.write(data)

    if recv_len < BUFFER_LEN:
    break

    else:
    while True:
    data = client_socket.recv(BUFFER_LEN)
    recv_len = len(data)

    # Append rest of data chunks
    with open(path, 'ab') as f:
    f.write(data)

    if recv_len < BUFFER_LEN:
    break
    break

    if not data:
    break

    client_socket.send(b"Successfully saved file.")

    except:
    client_socket.send(b"File transfer failed.")
    如果添加以下行,则我的递归解决方案适用于最大80GB的文件:
    sys.setrecursionlimit(20000)
    有人告诉我,我会听到很多“很好的理由说明存在极限”的说法,我对此毫不怀疑。但是,由于我的循环式解决方案草率而古怪,并且我的递归解决方案进入了这一庞大的递归冒险中,那么前进的更好方法是什么?还有我看不到的另一种选择吗?
    编辑:我省略了递归模型中的“尝试,除外”,只是看它是否可以工作。我计划将它们放回原处。
    编辑:传输后,我也没有关闭套接字,因此 not data状态不是我可以利用的。

    最佳答案

    递归解决方案存在问题,因为它多次打开同一文件可能会导致错误。while方法是正确的方法,应该正确地实现它。
    您应该打开一次文件,然后调用socket.recv直到它为空。当它不为空时,写入文件。最后关闭文件(或使用with open)。

    def write_file(path:str, client_socket:socket, open_mode: str = "wb"):
    with open(path, open_mode) as f:
    data = client_socket.recv(BUFFER_LEN)
    while data:
    f.write(data)
    data = client_socket.recv(BUFFER_LEN)
    client_socket.send(b"Successfully saved file.")
    在Python> = 3.8中,可以使用赋值表达式( :=)运算符进一步简化此操作:
    def write_file(path:str, client_socket:socket, open_mode: str = "wb"):
    with open(path, open_mode) as f:
    while data := client_socket.recv(BUFFER_LEN):
    f.write(data)
    client_socket.send(b"Successfully saved file.")

    关于python - (Python)得到最大的递归错误,在这种情况下我应该尝试其他方法还是重写它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64080384/

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