我需要编写一个具有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
答案 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来读取它。)