Ma olen väga hiljuti üle läinud Py 3.5-le. See kood töötas korralikult Python 2.7-s:
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
Pärast 3.5-le uuendamist saan ma'm saada:
TypeError: a bytes-like object is required, not 'str'
viga viimasel real (mustriotsingu kood).
Ma'olen proovinud kasutada .decode()
funktsiooni mõlemal pool avaldust, samuti proovitud:
if tmp.find('some-pattern') != -1: continue
- tulemusteta.
Ma suutsin peaaegu kõik 2:3 probleemid kiiresti lahendada, kuid see väike väide häirib mind.
Sa avasid faili binaarses režiimis:
with open(fname, 'rb') as f:
See tähendab, et kõik failist loetud andmed tagastatakse objektidena bytes
, mitte str
. Sa ei saa siis kasutada stringi sisalduse testis:
if 'some-pattern' in tmp: continue
Sa'pead selle asemel kasutama bytes
objekti, et testida tmp
vastu:
if b'some-pattern' in tmp: continue
või avada faili hoopis tekstifailina, asendades 'rb'
režiimi `'r'ga.
Nagu juba mainitud, loed sa faili binaarses režiimis ja seejärel loote baitide nimekirja. Järgnevas for tsüklis võrdlete te stringi ja baitide vahel ja see on koht, kus kood ebaõnnestub.
Baitide dekodeerimine loetelusse lisamise ajal peaks toimima. Muudetud kood peaks välja nägema järgmine:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
Baitide tüüp võeti kasutusele Python 3-s ja seetõttu töötas teie kood Python 2-s. Python 2-s ei olnud andmetüüpi bytes:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
selle väikese näite puhul: import socket
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()
lisades "b" enne "b". 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' lahendas minu probleemi