readlines / looping / matching string

时间:2014-06-12 14:53:47

标签: python python-2.7

我的目标是获取两个文本文件,读入它们,识别文件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)
  • 有完全不同的方法吗?
  • 我正在使用QApplication,因为我希望用户每次都选择文件。
  • 目前,条目_from_a
  • 尚未添加任何内容
  • 在旁注中,每次我运行它时,由于此错误,我需要退出Spyder并打开一个新窗口继续

    QWidget:必须在QPaintDevice

  • 之前构建QApplication

3 个答案:

答案 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