Pyqt5 TypeError:不能在类字节对象上使用字符串模式

时间:2015-03-06 14:49:04

标签: python regex pyqt5

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

之间提取行
  • show vlan

  • 显示

并写入另一个文件 - 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

2 个答案:

答案 0 :(得分:0)

使用

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

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

答案 1 :(得分:0)

在处理文件时混合使用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来读取它。)