【问题标题】:readlines / looping / matching stringreadlines/循环/匹配字符串
【发布时间】:2014-06-12 23:13:12
【问题描述】:

我的目标是获取两个文本文件,将它们读入,识别文件 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 是因为我希望用户每次都选择文件。
  • 目前,entry_from_a 中从未添加任何内容
  • 附带说明一下,每次我运行它时,由于这个错误,我都需要退出 Spyder 并打开一个新窗口才能继续

    QWidget:必须在 QPaintDevice 之前构造一个 QApplication

【问题讨论】:

  • 您的代码根本没有使用readlines_b。那你为什么用它呢?
  • 但是。我需要将 readlines_b 与相同的字符串进行匹配,然后用相应的 entries_from_a 覆盖这些行。

标签: python python-2.7


【解决方案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】:

    您在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
    

    所以您可能正在寻找的是遍历每一行的方法。

    【讨论】:

      【解决方案3】:

      您不需要调用文件的readlines 方法,因为文件对象是一个可迭代对象。

      with open( unicode ( QFileDialog.getOpenFileName() )) as f:
          readlines_a = [line for line in f]
      
      print readlines_a
      

      【讨论】:

        猜你喜欢
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多