Helpex - Trao đổi & giúp đỡ Đăng nhập
13

Tôi gặp lỗi sau khi cố gắng ghi một chuỗi vào tệp trong pythion:

Traceback (most recent call last):
  File "export_off.py", line 264, in execute
    save_off(self.properties.path, context)
  File "export_off.py", line 244, in save_off
    primary.write(file)
  File "export_off.py", line 181, in write
    variable.write(file)
  File "export_off.py", line 118, in write
    file.write(self.value)
TypeError: must be bytes or buffer, not str

Về cơ bản tôi có một lớp chuỗi, chứa một chuỗi:

class _off_str(object):
    __slots__ = 'value'
    def __init__(self, val=""):
        self.value=val

    def get_size(self):
        return SZ_SHORT

    def write(self,file):
        file.write(self.value)

    def __str__(self):
        return str(self.value)

Hơn nữa, tôi đang gọi lớp đó như thế này (trong đó biến là một mảng các đối tượng _off_str:

def write(self, file):
    for variable in self.variables:
        variable.write(file)

Tôi không biết chuyện gì đang xảy ra. Tôi đã thấy các chương trình python khác ghi chuỗi vào tệp, vậy tại sao chương trình này không thể?

Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn.

Chỉnh sửa: Có vẻ như tôi cần phải nêu rõ cách tôi đã mở tệp, đây là cách thực hiện:

file = open(filename, 'wb')
primary.write(file)
file.close()
13 hữu ích 5 bình luận 37k xem chia sẻ
9

Tôi nghi ngờ bạn đang sử dụng Python 3 và đã mở tệp ở chế độ nhị phân, chế độ này sẽ chỉ chấp nhận byte hoặc bộ đệm được ghi vào đó.

Bất kỳ cơ hội nào chúng ta có thể thấy mã mở tệp để viết?


sửa: Có vẻ như đó thực sự là thủ phạm.

9 hữu ích 0 bình luận chia sẻ
22

Bạn đang sử dụng phiên bản Python nào? Trong Python 3.xa chuỗi chứa văn bản Unicode không có mã hóa cụ thể. Để ghi nó ra một luồng byte (một tệp), bạn phải chuyển đổi nó thành một mã hóa byte như UTF-8, UTF-16, v.v. May mắn thay, điều này được thực hiện dễ dàng với encode()phương pháp:

Python 3.1.1 (...)
>>> s = 'This is a Unicode string'
>>> print(s.encode('utf-8'))

Một ví dụ khác, ghi UTF-16 vào một tệp:

>>> f = open('output.txt', 'wb')
>>> f.write(s.encode('utf-16'))

Cuối cùng, bạn có thể sử dụng chế độ văn bản "tự động" của Python 3, chế độ này sẽ tự động chuyển đổi của bạn strsang kiểu mã hóa mà bạn chỉ định:

>>> f = open('output.txt', 'wt', encoding='utf-8')
>>> f.write(s)
22 hữu ích 3 bình luận chia sẻ
3

Tôi không thấy bạn mở tệp trước:

file_handler = open(path)
file_handler.write(string)
file_handler.close()
3 hữu ích 4 bình luận chia sẻ
1

Tôi thấy trong bạn nhận xét bạn đã đề cập rằng bạn đã làm

file = open('xxx.xxx' ,'wb')

Điều đó có nghĩa là bạn đang mở tệp để ghi ở dạng nhị phân (vì vậy chỉ cần bỏ bcờ).

1 hữu ích 4 bình luận chia sẻ
0

Bạn đã mở tệp như thế nào?

Theo thông báo lỗi, tôi sẽ đoán:

f = open("file", "wb") # b for binary mode

Nếu bạn muốn sử dụng chuỗi, bạn phải sử dụng:

f = open("file", "w") 

Nếu bạn sử dụng "b", các tệp sẽ mong đợi dữ liệu nhị phân và bạn đang viết self.valuelà một chuỗi.

Nhân tiện, không sử dụng file"làm tên biến vì nó ẩn fileđối tượng Python tích hợp sẵn.

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python string file io python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading