kzen.dev
  • Frågor
  • Taggar
  • Användare
Meddelanden
Belöningar
Registrering
När du har registrerat dig kommer du att få information om svar och kommentarer på dina frågor.
Logga in
Om du redan har ett konto loggar du in för att kontrollera nya meddelanden.
Det kommer att finnas belöningar för frågor, svar och kommentarer.
Mer
Källa
Redigera
 masroore
masroore
Question

TypeError: ett bytesliknande objekt krävs, inte 'str' när du skriver till en fil i Python3

Jag har nyligen övergått till Py 3.5. Den här koden fungerade korrekt i 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

Efter att ha uppgraderat till 3.5 får jag följande:

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

fel på sista raden (koden för mönstersökning).

Jag har försökt att använda funktionen .decode() på båda sidor av uttalandet, och jag har också försökt:

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

- utan resultat.

Jag kunde lösa nästan alla 2:3-problem snabbt, men det här lilla uttalandet stör mig.

497 2015-10-10T13:28:09+00:00 3
Martijn Pieters
Martijn Pieters
Redigerad fråga 2019ör augusti 2019 в 11:30
Programmering
file
python
string
byte
python-3.x
Popular videos
Learn Python by Building Five Games - Full Course
Learn Python by Building Five Games - Full Course
för 3 år sedan
How to Fix Typeerror a bytes-like object is required not ‘str’
How to Fix Typeerror a bytes-like object is required not ‘str’
för 2 år sedan
How to Fix TypeError: NoneType Object is not iterable
How to Fix TypeError: NoneType Object is not iterable
för 1 år sedan
Python TypeError: 'NoneType' object is not iterable
Python TypeError: 'NoneType' object is not iterable
för 8 år sedan
How To Fix Type Error: Type Object is not Subscriptable
How To Fix Type Error: Type Object is not Subscriptable
för 2 år sedan
Python Tutorial: File Objects - Reading and Writing to Files
Python Tutorial: File Objects - Reading and Writing to Files
för 7 år sedan
TypeError: 'module' object is not callable
TypeError: 'module' object is not callable
för 2 år sedan
Python TypeError: 'module' object is not callable
Python TypeError: 'module' object is not callable
för 8 år sedan
How to Fix Type Error: Str Object is Not Callable
How to Fix Type Error: Str Object is Not Callable
för 2 år sedan
Python: Sort File Line by Line
Python: Sort File Line by Line
för 5 år sedan
Filer i Python Del2
Filer i Python Del2
för 4 år sedan
Filer i Python Del1
Filer i Python Del1
för 4 år sedan
[DA 15]  Importer Python filer i dit Python Script
[DA 15] Importer Python filer i dit Python Script
för 3 år sedan
PYTHON : TypeError: a bytes-like object is required, not 'str' when writing to a file in Python3
PYTHON : TypeError: a bytes-like object is required, not 'str' when writing to a file in Python3
för 1 år sedan
TypeError: a bytes-like object is required, not 'str' when writing to a file in Python3
TypeError: a bytes-like object is required, not 'str' when writing to a file in Python3
för 1 år sedan
Typkonvertering och korta ner rad i Python
Typkonvertering och korta ner rad i Python
för 3 år sedan
C programmering svenska - 23 - Skriva till en fil
C programmering svenska - 23 - Skriva till en fil
för 7 år sedan
Python 3 Programming Tutorial - Writing to File
Python 3 Programming Tutorial - Writing to File
för 9 år sedan
a bytes-like object is required, not 'str' | How to convert bytes to string in Python
a bytes-like object is required, not 'str' | How to convert bytes to string in Python
för 3 år sedan
« Föregående
Nästa »
Den här frågan har 1 svar på engelska, för att läsa dem logga in på ditt konto.
Solution / Answer
Martijn Pieters
Martijn Pieters
2015ör oktober 2015 в 1:30
2015-10-10T13:30:57+00:00
Mer
Källa
Redigera
#28842261

Du öppnade filen i binärt läge:

with open(fname, 'rb') as f:

Detta innebär att alla data som läses från filen returneras som bytes-objekt, inte str. Du kan alltså inte använda en sträng i ett inneslutningstest:

if 'some-pattern' in tmp: continue

Du måste använda ett bytes-objekt för att testa mot tmp istället:

if b'some-pattern' in tmp: continue

eller öppna filen som en textfil istället genom att ersätta läget 'rb' med 'r'.

470
0
 Suresh
Suresh
2016ör maj 2016 в 2:15
2016-05-17T02:15:36+00:00
Mer
Källa
Redigera
#28842263

Som redan nämnts läser du filen i binärt läge och skapar sedan en lista med bytes. I din följande for-slinga jämför du strängen med bytes och det är där koden misslyckas.

Avkodning av bytes medan du lägger till i listan bör fungera. Den ändrade koden bör se ut på följande sätt:

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

Bytes-typen infördes i Python 3 och det är därför din kod fungerade i Python 2. I Python 2 fanns det ingen datatyp för bytes:

>>> s=bytes('hello')
>>> type(s)
<type 'str'>
40
0
 starter
starter
2016ör mars 2016 в 11:59
2016-03-22T11:59:17+00:00
Mer
Källa
Redigera
#28842262

för detta lilla exempel: 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()

lägga till "b" före 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' löste mitt problem

14
0
Lägg till en fråga
Kategorier
Alla
Teknik
Kultur / fritid
Livet / Konst
Vetenskap
Professionell
Företag
Användare
Alla
Ny
Populära
1
Daniel Gogov
Registrerad för 6 dagar sedan
2
工藤 芳則
Registrerad för 1 vecka sedan
3
Ирина Беляева
Registrerad för 2 veckor sedan
4
Darya Arsenyeva
Registrerad för 2 veckor sedan
5
anyta nuam-nuam (LapuSiK)
Registrerad för 2 veckor sedan
BG
DA
DE
EL
ES
ET
FR
ID
IT
JA
NL
NO
PT
RO
RU
SV
TR
ZH
© kzen.dev 2023
Källa
stackoverflow.com
under licens cc by-sa 3.0 med angivande av