Am'am foarte recent migrat la Py 3.5. Acest cod a fost de lucru în mod corespunzător în 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
După actualizarea la 3.5, am'm obtinerea de:
TypeError: a bytes-like object is required, not 'str'
eroare pe ultima linie (modelul codul de căutare).
Am'am încercat, folosind .decode()
funcția pe fiecare parte a declarației, a încercat, de asemenea,:
if tmp.find('some-pattern') != -1: continue
- fără nici un rezultat.
Am fost capabil de a rezolva aproape toate 2:3 probleme de repede, dar această declarație nu-mi dă pace.
Ați deschis fișierul în mod binar:
with open(fname, 'rb') as f:
Acest lucru înseamnă că toate datele citite din fișier este returnat ca octeți
obiecte, nu str
. Nu puteți utiliza apoi un șir de caractere într-un test de izolare:
if 'some-pattern' in tmp: continue
Te'd trebuie să utilizați un octeți
obiect pentru a testa împotriva tmp` în loc:
if b'some-pattern' in tmp: continue
sau deschideți fișierul ca un textfile în loc de înlocuirea 'rb'
modul de cu 'r'
.
Ca ea a fost deja menționat, citiți fișierul în mod binar și apoi a crea o listă de bytes. În următoarele pentru buclă comparați șir de octeți și că este în cazul în care codul este faptul că nu.
Decodare octeți în timp ce adăugarea la lista ar trebui să funcționeze. Schimbat codul ar trebui să arate după cum urmează:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
Octeți tip a fost introdus în Python 3 și de aceea codul lucrat în Python 2. În Python 2 nu a fost nici un tip de date pentru bytes:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
Trebuie să se schimbe de la bm w:
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'wb'))
self.myCsv.writerow(['title', 'link'])
pentru a
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'w'))
self.myCsv.writerow(['title', 'link'])
După schimbarea asta, eroarea dispare, dar poate't scrie la dosar (în cazul meu). Deci, după toate, nu't avea un răspuns?
Sursa: https://stackoverflow.com/questions/3191289/how-to-remove-m/3191470#3191470
Schimbarea la 'rb' mi aduce alta eroare: io.UnsupportedOperation: scrie
pentru acest mic exemplu: import soclu
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()
adăugarea "b" înainte de a 'OBȚINE http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' mi-a rezolvat problema
Ați deschis fișierul în mod binar:
Codul de mai jos va arunca un TypeError: o bytes obiect ca este necesar, nu 'str'.
for line in lines:
print(type(line))# <class 'bytes'>
if 'substring' in line:
print('success')
Codul de mai jos va funcționa - trebuie să utilizați decoda funcția ():
for line in lines:
line = line.decode()
print(type(line))# <class 'str'>
if 'substring' in line:
print('success')
de ce nu încercați să deschideți fișierul dvs. ca text?
with open(fname, 'rt') as f:
lines = [x.strip() for x in f.readlines()]
În plus, aici este un link pentru python 3.x pe pagina oficială: https://docs.python.org/3/library/io.html Și acest lucru este de a deschide funcția: https://docs.python.org/3/library/functions.html#open
Dacă sunt într-adevăr încearcă să-l ocupe ca un binar, apoi ia în considerare codificarea șir.