我使用python来管理txt文件,多次读写。但如果我有1000个txt文件,我的代码需要很长时间来管理文件。
如何提高管理这些文件的性能?
我有包含此信息的文件:
position temperature
0,0 30,10
1,0 45,12
2,0 20,45 (...)
首先,我需要删除带有字符串的行。为了taht,我搜索字符串并创建新的txt文件,并将没有带字符串的行的信息复制到该新的txt文件。我明白了:
0,0 30,10
1,0 45,12
2,0 20,45 (...)
然后我替换了,by。在所有文件中,再次创建新文件并使用指向这些新文件的信息来处理信息。我明白了:
0.0 30.10
1.0 45.12
2.0 20.45 (...)
然后我需要用最小位置值(a)和最大值(b)来限制信息。所以在第一列中我只想要a和b之间的线。我再次创建新文件并将我想要的信息复制到这些文件中。
最后,我为每个文件添加了一个新列,其中包含一些信息。
所以,我认为我的代码耗费时间与创建新文件的时间有关,复制信息并用这些新文件替换旧文件。
也许这一切都可以一步完成。我只需要知道它是否可行。
由于
答案 0 :(得分:1)
您无需创建新文件只是为了删除第一行或将逗号替换为行中的点。你可以在内存中完成所有工作,即从文件中读取数据,将逗号替换为点,将值转换为浮点数,对它们进行排序,修剪最小值和最大值以及将结果写入文件,如下所示:
input_file = open('input_file', 'r')
data = []
input_file.readline() # first line with titles
for line in input_file: # lines with data
data.append(map(lambda x: float(x.replace(',', '.'), line.split()))
input_file.close()
data.sort(key=lambda x: x[1])
data = data[1:-1]
result_file = open('result_file', 'w')
result_file.writelines(['\t'.join(row) for row in data])
result_file.close()
答案 1 :(得分:-1)
你肯定是这么做的...你的问题的描述中缺少很多细节信息,但假设有一些东西 - 比如标题总是在第一行,“位置”和“温度” “应该是浮点数等 - 这是一个代码示例,主要执行您在一次传递中描述的内容:
import sys
from itertools import ifilter
def parse(path):
with open(path) as f:
# skip the headers
f.next()
# parse data
for lineno, line in enumerate(f, 1):
try:
position, temperature = line.split()
position = float(position.replace(",", "."))
temperature = float(temperature.replace(",","."))
except ValueError as e:
raise ValueError("Invalid line at %s:#%s" % (path, lineno))
yield position, temperature
def process(inpath, outpath, minpos, maxpos):
# warning: exact comparisons on floating points numbers
# are not safe
filterpos = lambda r: minpos <= r[0] <= maxpos
with open(outpath, "w") as outfile:
for pos, temp in ifilter(filterpos, parse(inpath)):
extra_col = compute_something_from(pos, temp)
out.writeline("{}\t{}\t{}\t{}\n".format(pos, temp, extra_col))
def compute_something_from(pos, temp):
# anything
return pos * (temp / 3.)
def main(*args):
# TODO :
# - clean options / args handling
# - outfile naming ?
minpos = float(args[0])
maxpos = float(args[1])
for inpath in args[2:]:
outpath = inpath + ".tmp"
process(inpath, outpath, minpos, maxpos)
if __name__ == "__main__":
main(*sys.argv[1:])