我正在尝试解析一些文本文件,需要提取文本块。具体来说,以“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行代码保存到另一个文件中,但无法知道如何执行此操作。任何帮助将不胜感激。
答案 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子句)