使用python

时间:2015-10-05 11:24:22

标签: python

我使用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之间的线。我再次创建新文件并将我想要的信息复制到这些文件中。

最后,我为每个文件添加了一个新列,其中包含一些信息。

所以,我认为我的代码耗费时间与创建新文件的时间有关,复制信息并用这些新文件替换旧文件。

也许这一切都可以一步完成。我只需要知道它是否可行。

由于

2 个答案:

答案 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:])