我的目标是获取两个文本文件,读入它们,识别文件A中需要替换文件B中相同行并保存为文件C的行。
我对如何从文件A中获取特定行感到困惑。我需要整行 - 我的可搜索字符串本质上是前X个字符,并始终以:开头。
from PyQt4.QtGui import *
searchable_strings = (':ABC',':123',':DEF')
entries_from_a = []
app = QApplication( sys.argv )
with open( unicode ( QFileDialog.getOpenFileName() )) as file_a:
readlines_a = file_a.read()
file_a.closed
with open( unicode ( QFileDialog.getOpenFileName() )) as file_b:
readlines_b = file_b.read()
file_b.closed
app.quit()
for line in readlines_a:
for item in searchable_strings:
if item in line:
entries_from_a.append(line)
在旁注中,每次我运行它时,由于此错误,我需要退出Spyder并打开一个新窗口继续
QWidget:必须在QPaintDevice
答案 0 :(得分:1)
entries_from_a
中没有得到任何内容的原因是因为for line in readlines_a
一次只能读取一个字符。而你所有的searchable_strings
都超过1个字符。
以下是一个例子:
echo "aaa\nbbb\n\ccc" > foo.txt
>>> with open('foo.txt') as f:
... my_data = f.read()
...
>>> for i in my_data:
... print i
...
a
a
a
\
n
b
# and so on
所以你可能正在寻找迭代每一行的方法。
答案 1 :(得分:1)
就像@Vor所说,你不是在for循环中迭代行,而是在字符串的字符上迭代。 file_a.read()
将整个文件作为一个字符串返回。例如,使用readlines_a = file_a.readlines()
将返回file_a
行的列表。所以会使用列表理解,这可能是更快的选择,如果你的文件很大,会更好。那么你的for循环会按照你想要的方式遍历行。
with open( unicode ( QFileDialog.getOpenFileName() )) as file_a:
readlines_a = file_a.readlines() # readlines() method
with open( unicode ( QFileDialog.getOpenFileName() )) as file_a:
readlines_a = [line for line in file_a] # list comprehension
然后你的for循环
可替换地:
with open('filefoo') as file_a:
with open('filebar') as file_b:
for line in file_a:
etc.
答案 2 :(得分:0)
您不需要调用文件的readlines
方法,因为文件对象是可迭代的对象。
with open( unicode ( QFileDialog.getOpenFileName() )) as f:
readlines_a = [line for line in f]
print readlines_a