【问题标题】:Read file in blocks分块读取文件
【发布时间】:2013-09-17 20:53:59
【问题描述】:

我遇到了一个我目前遇到的问题。

我有一个格式如下的大文件:

区块 1

Line 1: Something/Type2
Line 2: Time
Line 3: Data we need
Line 4: 00.*
Line 5: Fix 100
Line 6: In..
Line 7: Ou..
Line 8: Data we need
Line 9: Next
Line 10: Multi_Exit

第 2 块

Line 1: Something/Type1
Line 2: Time
Line 3: Data we need
Line 4: 00.*
Line 5: Fix 100
Line 6: In..
Line 7: Ou..
Line 8: Data we need
Line 9: Next
Line 10: Multi_Exit

块 3

Line 1: Something/Type1
Line 2: Time
Line 3: Data we need
Line 4: 00.*
Line 5: Fix 100
Line 6: In..
Line 7: Ou..
Line 8: Data we need
Line 9: Next
Line 10: Multi_Exit

第 4 块

Line 1: Type1/Type2
Line 2: Time
Line 3: Data we need
Line 4: 00.*
Line 5: Fix 100
Line 6: In..
Line 7: Ou..
Line 8: Data we need
Line 9: Next
Line 10: Multi_Exit

我想读取每个块的第一行,以检查是 Type1 还是 Type2。在此之后,我想打印每个块的第 3 行和第 8 行,并继续这样做直到文件结束。

我尝试了以下代码:

p = './file.txt'
fin = open(p, 'r')

for i, line in enumerate(fin):
if i%11 == 2 or i%11 == 7:
    print line
fin.close()

我注意到在我的大文件上运行此代码后,该行发生了变化。我只能假设我的块长度不固定为 10 行(在下一个块开始之前加上一个行间距)。所以这种方法并不理想。

我也尝试过正则表达式,但我无法以我想要的格式存储结果,例如:

For Type 1

文件的输出应该是: 第 3 行:数据第 8 行:数据

它之间有一个空格。

这是我尝试过的下一个代码:

for line in fin:
if re.match("(Line 1|Line 3|Line 8)", line):
    writeToFile(line)

writeToFile 函数执行以下操作:

def writeToFile(filein):
    p = './output.txt'
    fo = open(p, 'a')
    fo.write(filein)
    fo.close()

这是 output.txt 文件的外观:

Line 1: Something/Type2

Line 3: Data we need

Line 8: Data we need


Line 1: Something/Type1

Line 3: Data we need

Line 8: Data we need


Line 1: Something/Type1

Line 3: Data we need

Line 8: Data we need

这并不是我们想要的结果。我什至不介意玩弄这个输出文件并检查第 1 行是否是类型 1。然后将第 3 行和第 8 行放在同一行中。继续这样做,直到找到类型 2 并对第 3 行和第 8 行执行相同操作并将其存储在不同的输出文件中。

我希望我没有把事情复杂化。

编辑:

对不起,我没说清楚,也弄错了。

在第 1 行:/ 之前的第一部分我不感兴趣。之后我对它感兴趣,有时可能会选择 Type1 或 Type2。

理想的输出应该是,在第一行寻找Type,如果Type2输出:

Line 1: Type2 Line 3: Data we need Line 8: Data we need

如果类型1:

Line 1: Type1 Line 3: Data we need Line 8: Data we need
Line 1: Type1 Line 3: Data we need Line 8: Data we need

对所有具有相同类型的块进行分组。

编辑: 感谢用户:Floris

,我现在得到了我想要的输出

如果我将它提供给我的写入文件函数。

def writeToFile(type, outputString):
    p = './output'+type+'.txt'
    fo = open(p, 'a')
    line = '%s %s\n' % (type, outputString)
    fo.write(line)
    fo.close()

我的结果如下:

Type2 Line 3: Data we need Line 8: Data we need

Type1 Line 3: Data we need Line 8: Data we need
Type3 Line 3: Data we need Line 8: Data we need

当我指定如何将其保存为类型路径时,我的 writeToFile 会按类型对其进行排序。

谢谢

【问题讨论】:

  • 如果您显示您想要的确切输出,而不是尝试描述它,这将非常有帮助。例如,您说“文件输出应为:第 3 行:数据第 8 行:数据”。这可能意味着几件事。特别是,从您上次的输出来看,您希望输出中有“第 1 行:”行。我迷路了;-)
  • 让我试着解释一下。对于第 1 行显示“类型 1”的块,您希望连接第 3 行和第 8 行并发送到一个文件。对于“类型 2”,您想发送到另一个文件。 “块”是如何分离的? #block 单独排成一行?还是按空间?或者...
  • 我正在尝试根据我在第 1 行中找到的类型构建一个表:但我输出的格式应该与第 1 行:Type1(或 Type2)第 3 行:我们需要的数据相同第 8 行:我们需要的数据。

标签: python for-loop readline


【解决方案1】:

看看下面的代码是否能给你解决问题所需的灵感——我敢打赌:

import re
fin = open("./file.txt")

for line in fin:
    if re.match("Line 1:", line):
      # note we need to match "Line 1:" (including colon) so we don't match "Line 10"
      m = re.match(".*Type(.)", line)
      type = m.group(1)
      # we now know what type this group is
    if re.match("Line 3:", line):
      m = re.match(".*3:(.*)$", line)
      outputString = m.group(1)
      # have first half of output string
    if re.match("Line 8:", line):
      m = re.match(".*8:(.*)$", line)
      outputString += m.group(1)
      # have second half of output string, and we know where it needs to go:
      print "concatenated string of type ", type," is ", outputString
      # now send it where you want it to go... one of two open files, perhaps?

fin.close()    

【讨论】:

  • 我在第 1 行显示数据时犯了一个错误,因为我已对此进行了编辑。非常遗憾。第 1 行类似于第 1 行:Something/Type1(或 Type2)。有没有办法查看“/”之后的内容,如果将所有这些组合在一起,如果它更改为 Type2,然后将它们组合在一起?我喜欢你的输出,因为这是我的想法。我尝试使用“/”而不是您的示例类型并尝试放置另一个 If 循环?
  • 你可以在Type: m = re.match(".*Type(.)", line) 之前省略空格。在我的测试文件中,我有Type1/Type2(从您的示例中复制),我想找到“第一个数字”,这就是我首先添加空格的原因。如果Something 从不包含字符Type,那么这将起作用。我会相应地编辑答案。
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多