Python String strip()不工作

Python String strip()不工作,python,python-3.5,Python,Python 3.5,我是Python新手,在从字节数组转换的字符串中剥离多余的内容时遇到问题。代码从条形码读取器读取数据,然后将其与从文件读取的查找表进行比较(代码将查找表存储为列表数组)。条形码数据保存在从pyserial读取的字节数组中,我正试图将其转换为字符串,以便进行比较 文件读取: with open('LUT.csv', 'rt') as csvfile: lutFile = csv.reader(csvfile, delimiter=',') for line in lutFile: # th

我是Python新手,在从字节数组转换的字符串中剥离多余的内容时遇到问题。代码从条形码读取器读取数据,然后将其与从文件读取的查找表进行比较(代码将查找表存储为列表数组)。条形码数据保存在从pyserial读取的字节数组中,我正试图将其转换为字符串,以便进行比较

文件读取:

with open('LUT.csv', 'rt') as csvfile:
lutFile = csv.reader(csvfile, delimiter=',')
for line in lutFile:
    # the line is a list, append it to our lutTable list so that
    # when we are done scanning the file we will have the
    # complete list in memory.
    self.lutTable.append(line)
条码转换:

if gotBarcode:
    # We have received a barcode, see if we recognize it.
    #model               = self.byteArray.decode("utf8") <<-- This does not work either...
    modelString         = str(self.byteArray, encoding='utf-8', errors='strict')
    modelString.strip(' \t\n\r')
    self.modelNumber.config(text="%s" % modelString)
    self.serialCount    = 0
    searchIndex         = 0
    for i in self.lutTable:
        if (modelString == self.lutTable[searchIndex][0]):
            fileName = self.lutTable[i][0]
            break;
        else:
            print("Lut check:%d: model:%s---, table:%s---" %(searchIndex, modelString, self.lutTable[searchIndex][0]))
            fileName = 0;

        searchIndex += 1

    del self.byteArray[:]
    print("%s" % searchIndex)

    if fileName:
        self.FileName.config(text="%s" % fileName)

从代码中的打印看到的条形码数据,该代码还显示了查找表中的数据: 读取端口

Lut检查:0:型号:90000B4--,表:90000B1---
Lut检查:1:型号:90000B4---,表:90000B10---
Lut检查:2:型号:90000B4---,表:90000B2---
从串行端口输入的条形码数据长度为13字节,在从字节数组和尝试的空格条进行转换后,打印的字符串仍然是13个字符宽(这篇文章很难分辨,但在“型号:90000B4”之后还有6个额外字符)我真的不知道额外的6个字符是什么,但它们导致比较失败

平台说明:Windows7、Python 3.5.4


那么
modelString.strip('\t\n\r')
行有什么不正确/缺失呢?

您需要将
modelString.strip('\t\n\r')
的结果分配回
modelString
,如下所示:

modelString = modelString.strip(' \t\n\r')

您需要将
modelString.strip('\t\n\r')
的结果分配回
modelString
,如下所示:

modelString = modelString.strip(' \t\n\r')

为什么不干脆
.strip()
?我们无法重现您的问题,除非您发布实际字节(
[ord(b)for b in self.byteArray]
)。您可能应该使用ascii编码而不是utf-8。或者,如果使用字节,请坚持使用它们。。。字节字符串的
.strip
工作正常。。。或者,如果是显式的,那么使用
.strip(b'xyz')
是很好的,当然,您会有一个长度或一个已知的分隔符?这样,您就可以知道额外的数据是其他数据的开始还是“中断”…FWIW,OP确实发布了字节:
393030304234002009
。在UTF-8中,这是五个空格和末尾的一个制表符。基本问题是
条带
不能正常工作
str
对象是不可变的,因此,它们返回新的字符串对象。因此,您必须分配
my_string.strip
的结果,但从根本上说,似乎不需要转换为
str
,只需在
bytearray
对象上使用
.strip
方法……为什么不直接使用
.strip()
?我们无法重现您的问题,除非您发布实际字节(
[ord(b)for b in self.byteArray]
)。您可能应该使用ascii编码而不是utf-8。或者,如果使用字节,请坚持使用它们。。。字节字符串的
.strip
工作正常。。。或者,如果是显式的,那么使用
.strip(b'xyz')
是很好的,当然,您会有一个长度或一个已知的分隔符?这样,您就可以知道额外的数据是其他数据的开始还是“中断”…FWIW,OP确实发布了字节:
393030304234002009
。在UTF-8中,这是五个空格和末尾的一个制表符。基本问题是
条带
不能正常工作
str
对象是不可变的,因此,它们返回新的字符串对象。因此,您必须分配
my_string.strip
的结果,但从根本上说,似乎不需要将其转换为
str
,只需在
bytearray
对象上使用
.strip
方法即可……这就像宣传的那样有效。我还在上面的字节数组建议中尝试了相同的方法“self.byteArray=self.byteArray.strip(b'\x40\x09')”,但没有成功。谢谢…接得好。字符串在Python中是不可变的,因此没有任何字符串方法会改变字符串对象本身,所有方法都会返回一个新字符串或其他对象-您几乎总是想将
str.method(…)
的结果赋给某个变量。
'\x40'
从何而来?我在字节字符串中看不到这一点。也许应该是
'\x14'
?只需使用
byteArray.rstrip()
,就可以更轻松地删除所有尾随空格。谢谢Wyatt,就是这样。“self.byteArray=self.byteArray.strip(b'\x20\x09')”有效。所以我猜字节数组也是不可变的。根据,字节对象是不可变的,
bytes
对象是可变的,
bytearray
对象是可变的。这就像宣传的那样。我还在上面的字节数组建议中尝试了相同的方法“self.byteArray=self.byteArray.strip(b'\x40\x09')”,但没有成功。谢谢…接得好。字符串在Python中是不可变的,因此没有任何字符串方法会改变字符串对象本身,所有方法都会返回一个新字符串或其他对象-您几乎总是想将
str.method(…)
的结果赋给某个变量。
'\x40'
从何而来?我在字节字符串中看不到这一点。也许应该是
'\x14'
?只需使用
byteArray.rstrip()
,就可以更轻松地删除所有尾随空格。谢谢Wyatt,就是这样。“self.byteArray=self.byteArray.strip(b'\x20\x09')”有效。所以我猜字节数组也是不可变的。根据,
bytes
对象是不可变的,
bytearray
对象是可变的。