【问题标题】:string is not same in Python3x as for Python2.x but Still it is workingPython3x 中的字符串与 Python2.x 中的字符串不同,但它仍然有效
【发布时间】:2013-10-18 14:40:03
【问题描述】:

我对 Python 中的字符串感到困惑,

考虑这段代码,

fo = open("test.txt", "wb")
fo.write(bytes('Sufiyan','UTF-8'))

如果我要运行这段代码,它会给出这个错误,

Traceback (most recent call last):

  File "C:\Users\Sufiyan\Desktop\AES\a.py", line 2, in <module>

    fo.write('Sufiyan')

TypeError: 'str' does not support the buffer interface

因此,我必须将其转换为bytes 并提供编码类型。

fo = open("test.txt", "wb")
fo.write(bytes('Sufiyan','UTF-8'))

这是可行的,因为如果您使用 Python3x,那么 string 与 Python 2.x 的类型不同,您必须将其转换为字节(对其进行编码)。

现在,当我使用此代码写入文件时,

def BB_cf(file, *args, **kwargs): #Create files
    
    try:
        
        fo = open(file)
        fo.close()
        
    except IOError:

        print (file, 'not Found')
        print ("Creating file.....")
        fo = open(file, "w")
        print (file,"Created Successfully!")
        
        if file == 'input_Data.txt':
            print(file,"is Empty..\nWriting Data..")
            text = kwargs.get('text', None)
            fo.write(text)
            print("'"+text+"'", "is written in",file)
            fo.close()
            
        fo.close()

.

BB_cf('input_Data.txt', text='Sufiyan Ghori')

正如您在最后第 4 行看到的,fo.write(text),我还没有对其进行编码,但代码仍然有效。

为什么代码没有编码就可以工作?

现在如果我将它转换为bytes,它会给出以下错误,

Traceback(最近一次调用最后一次):

文件“C:\Users\Sufiyan\Desktop\AES\BlackBox.py”,第 47 行,在

BB_cf('input_Data.txt', text='Sufiyan Ghori')   File 

“C:\Users\Sufiyan\Desktop\AES\BlackBox.py”,第 41 行,在 BB_cf 中

fo.write(bytes(text,'UTF-8')) TypeError: must be str, not bytes

以上代码均使用 Python3x 运行, 第一个要我将string 编码为Bytes,而第二个在没有编码的情况下运行。

【问题讨论】:

    标签: python string python-3.x


    【解决方案1】:

    第一次,您通过 fo = open("test.txt", "wb") 打开文件。第二次,你做fo = open(file, "w")。字符串 "wb" 向 Python 表明您只想使用字节而不是字符串来写入文件,而第二个示例中的字符串 "w" 则相反。

    具体来说,open 函数的文档指出:

    如概述中所述,Python 区分二进制和文本 I/O。以二进制模式打开的文件(包括模式参数中的“b”)将内容作为字节对象返回,无需任何解码。在文本模式下(默认值,或者当模式参数中包含 't' 时),文件的内容以 str 形式返回,字节首先使用平台相关的编码进行解码,或者如果给定,则使用指定的编码。

    (我添加的重点)

    【讨论】:

    • 我明白了,但是如果我首先将字符串转换为 bytearray 并使用 "wb" 将其写入文件,那么如果不将其编码为字节,它不应该也可以工作吗?
    • @Xufyan:是的,应该。这实际上不起作用吗? bytes 和 bytearray 之间的唯一区别是后者是可变的(你可以写入它)。它们都具有相同的字节级内容。
    猜你喜欢
    • 2023-03-13
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多