使用Python解析文本文件中的文本块

时间:2014-07-30 21:25:09

标签: python string-parsing

我正在尝试解析一些文本文件,需要提取文本块。具体来说,以“1:”开头的行和文本后的19行。 “1:”不会在每个文件的同一行开始,只有一个“1:”实例。我宁愿保存文本块并将其导出到单独的文件中。另外,我需要保留原始文件中文本的格式。

毋庸置疑,我是Python新手。我通常使用R,但这些文件与R不兼容,我有大约100个处理。任何信息,将不胜感激。

到目前为止我的代码是:

tmp = open(files[0],"r") 
lines = tmp.readlines()
tmp.close()

num = 0
a=0

for line in lines:
    num += 1    
    if "1:" in line:
      a = num 
      break

a = num是我想要的文本块的行号。然后我想将另外19行代码保存到另一个文件中,但无法知道如何执行此操作。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

这是一个选项。阅读文件中的所有行。迭代直到找到你的线并返回接下来的19行。您需要处理文件中不包含额外19行的情况。

    fh = open('yourfile.txt', 'r')
    all_lines = fh.readlines()
    fh.close()
    for count, line in enumerate(all_lines):
        if "1:" in line:
            return all_lines[count+1:count+20]

答案 1 :(得分:0)

可以在单行中完成......

open(files[0]).read().split('1:', 1)[1].split('\n')[:19]

或更具可读性

txt = open(files[0]).read()           # read the file into a big string
before, after = txt.split('1:', 1)    # split the file on the first "1:"
after_lines = after.split('\n')       # create lines from the after text
lines_to_save = after_lines[:19]      # grab the first 19 lines after "1:"

然后使用换行符连接行(并在最后添加换行符),然后再将其写入新文件:

out_text = "1:"                       # add back "1:"
out_text += "\n".join(lines_to_save)  # add all 19 lines with newlines between them
out_text += "\n"                      # add a newline at the end

open("outputfile.txt", "w").write(out_text)

为了遵守读取和写入文件的最佳实践,您还应该使用with语句来确保文件句柄尽快关闭。您可以为它创建便利功能:

def read_file(fname):
    "Returns contents of file with name `fname`."
    with open(fname) as fp:
         return fp.read()

def write_file(fname, txt):
    "Writes `txt` to a file named `fname`."
    with open(fname, 'w') as fp:
         fp.write(txt)

然后你可以用上面的第一行替换:

txt = read_file(files[0])

和最后一行:

write_file("outputfile.txt", out_text)

答案 2 :(得分:0)

我总是首先将文件读入内存,但有时这是不可能的。如果你想使用迭代,那么这将起作用:

def process_file(fname):
    with open(fname) as fp:
        for line in fp:
            if line.startswith('1:'):
                break
        else:
            return    # no '1:' in file

        yield line    # yield line containing '1:'
        for i, line in enumerate(fp):
            if i >= 19:
                break
            yield line


if __name__ == "__main__":
    with open('ouput.txt', 'w') as fp:
        for line in process_file('intxt.txt'):
            fp.write(line)

它在for循环上使用else:子句,你不再经常看到它,但是是为了这个目的而创建的(如果for循环没有中断,则执行else子句)