Python TypeError:强制使用Unicode:需要字符串或缓冲区,找到ZipFile

Python TypeError:强制使用Unicode:需要字符串或缓冲区,找到ZipFile,python,unicode,tcp,network-programming,zip,Python,Unicode,Tcp,Network Programming,Zip,我有一个服务器,它应该向客户端请求一个文件,将其压缩并发送给客户端。我在将zip文件发送到服务器时遇到了一些问题 这是我收到的错误: File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner self.run() File "/Library/Frameworks/Python.framework/Versions/2.7/

我有一个服务器,它应该向客户端请求一个文件,将其压缩并发送给客户端。我在将zip文件发送到服务器时遇到了一些问题

这是我收到的错误:

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Alcantara/Desktop/Final/Server.py", line 9, in RetrFile
for dirname, subdirs, files in os.walk(Zip):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", line 278, in walk
names = listdir(top)
TypeError: coercing to Unicode: need string or buffer, ZipFile found
这是我的服务器:

import socket
import threading
import os
import zipfile

def RetrFile(name, sock):
    Zip = sock.recv(1024)
    Zip = zipfile.ZipFile("new_" + Zip +".zip", "w")
    for dirname, subdirs, files in os.walk(Zip):
        Zip.write(dirname)
        for filename in files:
            Zip.write(os.path.join(dirname, filename))
    Zip.close()
    with open(filename, 'rb') as f:
        bytesToSend = f.read(1024)
        sock.send(bytesToSend)
        while bytesToSend != "":
            bytesToSend = f.read(1024)
            sock.send(bytesToSend)

    sock.close()

def Main():
    host = '127.0.0.1'
    port = 5000


    s = socket.socket()
    s.bind((host,port))

    s.listen(5)

    print "Server Started."
    while True:
        c, addr = s.accept()
        print "client connedted ip:<" + str(addr) + ">"
        t = threading.Thread(target=RetrFile, args=("RetrThread", c))
        t.start()

    s.close()

if __name__ == '__main__':
    Main()
导入套接字
导入线程
导入操作系统
进口拉链
def RetrFile(名称、sock):
Zip=sock.recv(1024)
Zip=zipfile.zipfile(“新的”+Zip+“.Zip”,“w”)
对于os.walk(Zip)中的目录名、子目录和文件:
Zip.write(dirname)
对于文件中的文件名:
write(os.path.join(dirname,filename))
Zip.close()
将open(filename,'rb')作为f:
bytesToSend=f.read(1024)
sock.send(bytesToSend)
而bytesToSend!="":
bytesToSend=f.read(1024)
sock.send(bytesToSend)
sock.close()
def Main():
主机='127.0.0.1'
端口=5000
s=socket.socket()
s、 绑定((主机、端口))
s、 听(5)
打印“服务器已启动”
尽管如此:
c、 addr=s.accept()
打印“客户端连接的ip:”
线程(target=RetrFile,args=(“RetrThread”,c))
t、 开始()
s、 关闭()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
Main()
客户:

import socket

def Main():
host = '127.0.0.1'
port = 5000

s = socket.socket()
s.connect((host, port))

filename = raw_input("Filename? -> ")
if filename != 'q':
    s.send(filename)
    f = open('new_'+filename, 'wb')
    data = s.recv(1024)
    totalRecv = len(data)
    f.write(data)
    while totalRecv < filesize:
        data = s.recv(1024)
        totalRecv += len(data)
        f.write(data)
        print "{0:.2f}".format((totalRecv/float(filesize))*100)+ "% Done"
        print "Download Complete!"
    f.close()
else:
    print "File Does Not Exist!"

s.close()


if __name__ == '__main__':
    Main()
导入套接字
def Main():
主机='127.0.0.1'
端口=5000
s=socket.socket()
s、 连接((主机、端口))
文件名=原始输入(“文件名?->”)
如果文件名!='q':
s、 发送(文件名)
f=打开('new_'+文件名'wb')
数据=s.recv(1024)
totalRecv=len(数据)
f、 写入(数据)
totalRecv<文件大小:
数据=s.recv(1024)
totalRecv+=len(数据)
f、 写入(数据)
打印“{0:.2f}”。格式((totalRecv/float(filesize))*100)+%Done
打印“下载完成!”
f、 关闭()
其他:
打印“文件不存在!”
s、 关闭()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
Main()
考虑以下几行:

Zip = sock.recv(1024)
Zip = zipfile.ZipFile("new_" + Zip +".zip", "w")
for dirname, subdirs, files in os.walk(Zip):
您使用相同的变量名来引用接收到的数据(第1行和第3行)以及
ZipFile
对象(第2行)

请尝试以下方法:

#UNTESTED
zname = sock.recv(1024)
zfile = zipfile.ZipFile("new_" + Zip +".zip", "w")
for dirname, subdirs, files in os.walk(zname):
    zfile.write(dirname)
    for filename in files:
        zfile.write(os.path.join(dirname, filename))
zfile.close()
with open("new_" + zname + ".zip", 'rb') as f:
    # ... the rest is unchanged

您发送到服务器的内容是什么?文件路径?或者带文件的目录路径?我发送了带文件的目录路径。我想压缩目录(包括其中的文件)并将其作为zip文件发送给客户端。通过使用您的更正,我得到了以下错误:AttributeError:“\u socketobject”对象没有属性“write”My bad。你不能那样使用shutil.copyfileobj。我有一个压缩文件的工作脚本和一个传输文件的工作服务器/客户端。我只需要知道如何将它们组合成一个脚本。