python 3.5:TypeError:寫入文件時需要類似字節的對象,而不是'str'


Answers

您可以使用.encode()對您的字符串進行編碼

例:

'Hello World'.encode()
Question

我最近遷移到Py 3.5。 這段代碼在Python 2.7中正常工作:

with open(fname, 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip().lower()
    if 'some-pattern' in tmp: continue
    # ... code

升級到3.5後,我得到:

TypeError: a bytes-like object is required, not 'str'

最後一行錯誤(模式搜索代碼)。

我試過在聲明的任一側使用.decode()函數,也嘗試過:

if tmp.find('some-pattern') != -1: continue

- 無濟於事。

我幾乎能夠快速解決所有2:3問題,但是這個小小的陳述讓我煩惱不已。




為什麼不嘗試打開文件作為文本?

with open(fname, 'rt') as f:
    lines = [x.strip() for x in f.readlines()]

另外這裡是官方頁面上的python 3.x鏈接: https://docs.python.org/3/library/io.html : https://docs.python.org/3/library/io.html這是一個開放的函數: https://docs.python.org/3/library/functions.html#openhttps://docs.python.org/3/library/functions.html#open

如果你真的想把它作為一個二進製文件來處理,那麼就考慮編碼你的字符串。




對於這個小例子:導入套接字

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print (data);

mysock.close()

在'GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n'之前添加“b”解決了我的問題