Programing

TypeError: Python3에서 파일에 쓸 때 'str'이 아니라 바이트와 같은 개체가 필요함

c10106 2022. 3. 24. 20:42
반응형

TypeError: Python3에서 파일에 쓸 때 'str'이 아니라 바이트와 같은 개체가 필요함

나는 매우 최근에 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, 'rb') as f:

이는 파일에서 읽은 모든 데이터가 다음과 같이 반환됨을 의미한다.bytes아닌 물건str그러면 격납 테스트에서 문자열을 사용할 수 없음:

if 'some-pattern' in tmp: continue

A를 사용해야 할 것이다.bytes에 대해 테스트할 것을 반대하다.tmp대신:

if b'some-pattern' in tmp: continue

또는 파일을 텍스트 파일로 여십시오.'rb'을 모드로 하다.'r'.

다음 명령을 사용하여 문자열을 인코딩할 수 있음.encode()

예:

'Hello World'.encode()

이미 언급했듯이, 당신은 이진 모드에서 파일을 읽은 다음 바이트 목록을 만들고 있다.루프의 다음 항목에서는 문자열을 바이트와 비교하고 있으며, 여기서 코드가 실패한다.

목록에 추가하는 동안 바이트를 디코딩하는 것이 효과적일 것이다.변경된 코드는 다음과 같아야 한다.

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

바이트 타입은 파이톤 3에 도입되었고 그래서 당신의 코드는 파이톤 2에서 작동되었다.Python 2에서는 바이트에 대한 데이터 유형이 없었다.

>>> s=bytes('hello')
>>> type(s)
<type 'str'>

wb에서 w:로 변경해야 한다.

def __init__(self):
    self.myCsv = csv.writer(open('Item.csv', 'wb')) 
    self.myCsv.writerow(['title', 'link'])

def __init__(self):
    self.myCsv = csv.writer(open('Item.csv', 'w'))
    self.myCsv.writerow(['title', 'link'])

이것을 변경하면 오류가 사라지지만 (나의 경우) 파일에 쓸 수 없다.그럼 결국, 나는 대답이 없단 말인가?

출처: ^M 제거 방법

'rb'로 바꾸면 또 다른 오류인 io가 생긴다.지원되지 않는 작업: 쓰기

이 작은 예에 대해:

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()

GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n\n' 앞에 "b"를 추가하면 내 문제가 해결된다.

단일 따옴표로 제공된 하드 코드화된 문자열 값과 함께 encode() 함수를 사용하십시오.

Ex:

file.write(answers[i] + '\n'.encode())

OR

line.split(' +++$+++ '.encode())

이진 모드에서 파일을 연 경우:

다음 코드는 TypeError를 발생시킨다: 'str'이 아니라 바이트와 같은 개체가 필요하다.

for line in lines:
    print(type(line))# <class 'bytes'>
    if 'substring' in line:
       print('success')

다음 코드가 작동함 - 디코드() 기능을 사용해야 함:

for line in lines:
    line = line.decode()
    print(type(line))# <class 'str'>
    if 'substring' in line:
       print('success')

파일을 텍스트로 열어보는 것은 어떨까?

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/functions.html#open.

이진수로 처리하려는 경우 문자열을 인코딩해 보십시오.

문자(또는 문자열)를 다음으로 변환하려고 할 때 이 오류가 발생함bytes는 Python 2.7과 한국 Python 2.7과 입니다

# -*- coding: utf-8 -*-
print( bytes('ò') )

유니코드 문자를 다룰 때 Python 2.7의 방식이다.

Python 3.6에서는 이 기능이 작동하지 않을 겁니다.bytes인코딩을 위해 추가 인수가 필요하지만 인코딩마다 다른 결과를 출력할 수 있기 때문에 이는 거의 까다롭지 않을 수 있다.

print( bytes('ò', 'iso_8859_1') ) # prints: b'\xf2'
print( bytes('ò', 'utf-8') ) # prints: b'\xc3\xb2'

내 경우에는 내가 사용해야만 했다.iso_8859_1문제를 해결하기 위해 바이트를 인코딩할 때.

이게 누군가에게 도움이 되길 바래.

참조URL: https://stackoverflow.com/questions/33054527/typeerror-a-bytes-like-object-is-required-not-str-when-writing-to-a-file-in

반응형