簡體   English   中英

使用Python 2.7 / Pyro4 UnicodeEncodeError傳輸文件

[英]Transfer files with Python 2.7/Pyro4 UnicodeEncodeError

因此,我試圖通過使用它創建一個簡單的文件服務器來學習Pyro。 我已經實現了一些基本功能,現在我正在嘗試添加文件傳輸。 我已經看過如何執行此操作的示例( https://github.com/irmen/Pyro4/tree/master/examples/filetransfer ),而使用純Pyro的方式似乎只是返回讀取的字節從文件中寫入到接收端。

這就是我所做的(我知道我確實應該在發送文件時分解文件,但是一旦解決此問題,我就可以這樣做):

client.py

import Pyro4

server= Pyro4.Proxy("PYRONAME:server")

def download(file_name):
    output_file = open(file_name, "wb")
    output_file.write(server.download(file_name))
    output_file.close()
    print "Downloaded file: {}".format(file_name)

server.py

import Pyro4

@Pyro4.expose
class Server(object):
    def download(self, file_name):
        return open(file_name, "rb").read()

daemon = Pyro4.Daemon()
ns = Pyro4.locateNS()
uri = daemon.register(Server)
ns.register("server", uri)
daemon.requestLoop()

這對於一些簡單的文件(例如某些.txt文檔)來說很好用,但是當我嘗試其他文件類型(例如.pdf)時,出現錯誤:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14: ordinal no in range(128)

我花了一些時間查找此錯誤,而最接近解決方案的方法是更改​​client.py中的這一行:

output_file.write(server.download(file_name))

至:

output_file.write(server.download(file_name).encode("ascii", "replace"))

這樣可以避免錯誤,完成下載並提供正確大小的文件。 但是該文件已損壞且無法打開。

任何建議如何解決此問題? 如果沒有其他方法可以用Pyro進行文件傳輸?

這是因為file.write只能寫入字節,並且還會嘗試將輸入字符串轉換為ascii編碼。 您的pdf文件使用不同的編碼(也許是UTF-8)。 您可以嘗試類似

fptr.write(byte_string).encode("utf-8"))

在處理文件時,我觀察到相同的錯誤。 這是由於除了ascii之外的一些編碼。 您可以參考此SO Post以獲得更多信息。 有關pdf編碼的更多信息,請參閱 pdf的第86頁。

看到這里: https : //github.com/irmen/Pyro4/blob/master/examples/filetransfer/client.py#L14

如果使用蛇,則需要特別注意正確處理序列化的字節。 該示例顯示了如何執行此操作。

使用pickle或marshal序列化程序時,將對二進制數據進行更有效的有線編碼。 此處的詳情https://pyro4.readthedocs.io/en/stable/tipstricks.html#binary-data-transfer-file-transfer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM