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
然后需要打开文件并提取
之间的行
- 显示 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
使用
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 来读取它。)
我需要编写一个具有 GUI 的程序来输入文件 - shtech1.txt 然后需要打开文件并提取
之间的行- 显示 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
使用
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 来读取它。)