0

我有一个非常大的文件需要解析。我不需要任何高达'&'. 我只需要'&'文件中的信息。如何删除之前的行'&'?这是我到目前为止所拥有的:

import re

original_file = 'file.rpt'
file_copy = 'file_copy.rpt'

with open(original_file, 'r') as rf:
    with open(file_copy, 'r+') as wf:
        for line in rf:
            #if statement to write after the '&' has been encountered?
            wf.write(line)

输入文件:

sample text1
sample text2
sample text3
sample text4
&sample text5
sample text6

expected output file:
&sample text5
sample text6

在 rpt 文件中,它有 6 行,第 1-4 行是不需要的信息。我想删除第 1-4 行,所以我可以专注于第 5 和第 6 行。

4

2 回答 2

1

更好更安全的方法是创建一个内容较小的新文件,以便在删除旧文件之前检查内容。所以我的建议是这样的:


original_file = 'file.rpt'
file_copy = 'file_copy.rpt'
omit = True
with open(original_file, 'r') as rf:
    with open(file_copy, 'w') as wf:
        for line in rf:
            if "&" in line:
                omit = False
            if omit:
                continue
            else:
                wf.write(line)

此代码将省略所有行,直到包含&

您还可以分析带有&符号的行:

original_file = 'file.rpt'
file_copy = 'file_copy.rpt'
omit = True
with open(original_file, 'r') as rf:
    with open(file_copy, 'r+') as wf:
        for line in rf:
            if "&" in line:
                before,after = line.split("&")
                wf.write(after)
                omit = False
                continue
            if omit:
                continue
            else:
                wf.write(line)

以上内容还将在同一行之后写入所有内容,&并在同一行中省略之前的任何&内容

编辑

还要检查您是否以正确的模式打开第二个文件,也许您应该'w'首先使用截断文件'r+'将附加到文件的内容,我不确定这是您想要的

于 2019-06-17T16:31:05.367 回答
0

如果您只想处理文件的某些部分,则实际上不需要修改文件。使用您的原始代码,您可以加载所需的部分:

def load_data(filename):
    with open(filename, 'r') as f:
        for line in f:
            if '&' in line:  # or if line.startswith('&'):
                break
        else:
            return []
        return [line] + list(f)

该函数load_data将在&它遇到的第一行之后加载所有行。然后,您可以将数据写入另一个文件,只需按照您的选择进行处理。

你甚至可以把它变成一个惰性生成器,它只会在你需要的时候返回行:

def trim_data(filename):
    with open(filename, 'r') as f:
        for line in f:
            if '&' in line:  # or if line.startswith('&'):
                yield line
                break
        else:
            return
        yield from f

如果您想这样做,以这种方式复制文件会更容易:

with open(copy_file, 'w') as f:
    for line in trim_data(original_file):
        f.write(line)
于 2019-06-17T16:37:04.840 回答