打开和关闭文件操作相对较慢。如果可能,您应该只打开和关闭一次文件。在你的情况下,你可以将p和g行存储在列表中,然后在循环结束后立即写入所有行。
file = open('D:\\mydirectory\\soggetti.txt','r')
file_pf = open("D:\\mydirectory\\file_pf.txt","w")
file_pg = open("D:\\mydirectory\\file_pg.txt","w")
file_pf.close()
file_pg.close()
p_lines = []
g_lines = []
i = 0
with file:
for line in file:
i = 0
c = 0
while i < len(line):
carattere = line[i]
if carattere == "|":
c = c + 1
if c == 4:
if line[i-1] == "P":
p_lines.append(line)
break
elif line[i-1] == "G":
g_lines.append(line)
break
i = i + 1
file.close()
file_pf = open("D:\\mydirectory\\file_pf.txt","w")
file_pf.writelines(p_lines)
file_pf.close()
file_pg = open("D:\\mydirectory\\file_pg.txt","w")
file_pg.writelines(g_lines)
file_pg.close()
您还可以通过使用split
更容易地识别每行中字段的内容。
file = open('D:\\mydirectory\\soggetti.txt','r')
file_pf = open("D:\\mydirectory\\file_pf.txt","w")
file_pg = open("D:\\mydirectory\\file_pg.txt","w")
file_pf.close()
file_pg.close()
p_lines = []
g_lines = []
with file:
for line in file:
fields = line.split("|")
if fields[3] == "P":
p_lines.append(line)
elif fields[3] == "G":
g_lines.append(line)
file.close()
file_pf = open("D:\\mydirectory\\file_pf.txt","w")
file_pf.writelines(p_lines)
file_pf.close()
file_pg = open("D:\\mydirectory\\file_pg.txt","w")
file_pg.writelines(g_lines)
file_pg.close()
顺便说,严格来说,你并不需要使用with
和明确关闭该文件一旦你用它做。你可以做一个或另一个。在脚本开始时不需要打开并立即关闭file_pf
和file_pg
。
p_lines = []
g_lines = []
with open('D:\\mydirectory\\soggetti.txt','r') as file:
for line in file:
fields = line.split("|")
if fields[3] == "P":
p_lines.append(line)
elif fields[3] == "G":
g_lines.append(line)
file_pf = open("D:\\mydirectory\\file_pf.txt","w")
file_pf.writelines(p_lines)
file_pf.close()
file_pg = open("D:\\mydirectory\\file_pg.txt","w")
file_pg.writelines(g_lines)
file_pg.close()
如果您想拥有比“P”和未来的“g”等多个线路类型,它可以为您节省一些时间,各种线条的存储在词典:
from collections import defaultdict
lines_to_write = defaultdict(list)
with file as open('D:\\mydirectory\\soggetti.txt','r'):
for line in file:
fields = line.split("|")
lineType = fields[3].lower()
lines_to_write[lineType].append(line)
for lineType, lines in lines_to_write.iteritems():
filename = "D:\\mydirectory\\file_{}f.txt".format(lineType)
with file as open(filename,"w"):
file.writelines(lines)
您可以通过跟踪您所在的行号并定期打印消息来向用户报告已处理了多少行。
how_often_to_report = 100 #prints message every one hundred lines
with file as open('D:\\mydirectory\\soggetti.txt','r'):
for line_number, line in enumerate(file):
if line_number % how_often_to_report == 0:
print "{} lines processed", line_number
#do rest of processing work here
'line.split( '|')[3]'应该给你 'P' 或 'G' 为每一行。打开和关闭每个写入的输出文件也非常昂贵。在开始时打开它们,并在最后关闭它们。如果你担心异常,那么使用'closing'上下文管理器。 – PaulMcG