Pyqt5 TypeError: can't use a string pattern on a bytes-like object

Pyqt5 TypeError: can't use a string pattern on a bytes-like object

我需要编写一个具有 GUI 的程序来输入文件 - shtech1.txt 然后需要打开文件并提取

之间的行

并写入另一个文件 - shvlan1.txt

下面是我的程序,我收到错误 TypeError: can't use a string pattern on a bytes-like object 在线:

if re.match('- show vlan -',line):

有人可以帮我解决这个问题吗

代码:

def on_pushButton_clicked(self): #shtech1
    dialog = QFileDialog(self)
    dialog.exec_()
    for file in dialog.selectedFiles():
        shtech1 = QFile(file)
        shtech1.open(QFile.ReadOnly)
        found = False
        copy = False
        shvlan1 = open('shvlan1.txt', 'a')
        while not found:
           line = shtech1.readLine()
           print("line is",line)

           if re.match('- show vlan -',line):
              copy = True
              print ("copy is True")
           elif re.match('- show',line):
              if copy:
                 found = True
                 copy = False
                 print ("copy is False")
              elif copy:
                 shvlan1.write(line)
                 print ("printing")
    shvlan1.close()
    shtech1.close()

出现以下错误:

File "UImlag.py", line 34, in on_pushButton_clicked
if re.match('- show vlan -',line):
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/re.py", line 160, in match
return _compile(pattern, flags).match(string)
TypeError: can't use a string pattern on a bytes-like object

使用

str(line).decode('utf-8')

将其转换为正则表达式处理的字符串。您可能需要替换为您的 qt 使用的编码(这是一个偏好)。

在处理文件时混合使用 Qt 和 Python API 时需要小心。

以下是当您使用 QFile 阅读一行时会发生的情况:

>>> from PyQt5 import QtCore
>>> qfile = QtCore.QFile('test.txt')
>>> qfile.open(QtCore.QFile.ReadOnly)
True
>>> qfile.readLine()
PyQt5.QtCore.QByteArray(b'foo\n')

因此,在 Python 中,就像打开这样的文件一样:

>>> pfile = open('test.txt', 'rb')
>>> pfile.readline()
b'foo\n'

只有你得到 QByteArray 而不是 bytes

Qt 以文本模式打开文件的方法是使用 QTextStream:

>>> stream = QtCore.QTextStream(qfile)
>>> stream.readLine()
'foo\n'

但说真的,既然你能做到这一点,为什么还要这么乱来:

>>> pfile = open('test.txt')
>>> pfile.readline()
'foo\n'

(仅仅因为您从 QFileDialog 获取文件名并不意味着您必须使用 Qt API 来读取它。)