0

在我所说的目录中,有 30 个 txt 文件,每个文件包含两列数字,每列大约有 6000 个数字。我想做的是导入前 3 个 txt 文件,处理给我所需输出的数据,然后我想转到下 3 个 txt 文件。

该目录如下所示:

文件0a

文件0b

文件0c

文件1a

文件1b

file1c ...等等。

我不想同时导入所有的 txt 文件,我想导入前 3 个,处理数据,然后是下 3 个,依此类推。我正在考虑制作一本字典——尽管我觉得这可能涉及在字典中写入每个文件名,这将花费太长时间。

编辑:

对于那些感兴趣的人,我想我已经想出了一个解决方法。任何反馈都将不胜感激,因为我不确定这是最快的做事方式还是最pythonic的方式。

import glob

def chunks(l,n):
  for i in xrange(0,len(l),n):
    yield l[i:i+n]


   Data = []

   txt_files = glob.iglob("./*.txt")

   for data in txt_files:
     d = np.loadtxt(data, dtype = np.float64)
     Data.append(d)

   Data_raw_all  = list(chunks(Data,3))

这里的“Data”列表是目录中的所有文本文件,“Data_raw_all”使用函数“chunks”将“Data”中的元素分组为 3 个一组。这样,您可以在 Data_raw_all 中选择一个元素来选择目录中对应的3个文本文件。

4

2 回答 2

1

我假设您想对尽可能少的文件名进行硬编码。因此,大部分代码用于生成文件名。然后使用with语句打开文件。

示例代码:

from itertools import cycle, count

root = "UVF2CNa"

for n in count(1):
    for char in cycle("abc"):
        first_part = "{}{}{}".format(root, n, char)
        try:
            with open(first_part + "i") as i,\
                 open(first_part + "j") as j,\
                 open(first_part + "k") as k:
                # do stuff with files i, j and k here
                pass
        except FileNotFoundError:
            # deal with this however
            pass
于 2013-08-20T12:34:36.770 回答
1

首先,我在这里没有任何原创内容,我绝对不想声称它的功劳,因为这一切都来自Python Cookbook 3rd Ed和David Beazley 的关于生成器的精彩演讲(其中一位合作者)上述食谱的作者)。但是,我认为您可能会真正受益于生成器幻灯片中给出的示例。

Beazley 所做的是将一堆生成器链接在一起以执行以下操作:

  1. 产生与给定文件名模式匹配的文件名。
  2. 从一系列文件名中产生打开的文件对象。
  3. 将一系列生成器连接成一个序列
  4. grep 一系列与正则表达式模式匹配的行

所有这些代码示例都位于此处。这种方法的美妙之处在于链式生成器只是简单地咀嚼next信息片段:它们不会为了处理所有数据而将所有文件加载到内存中。这真的是一个很好的解决方案。

无论如何,如果你通读幻灯片,我相信它会给你一个你想要做什么的蓝图:你只需要根据你正在寻找的信息来改变它。

简而言之,请查看上面链接的幻灯片并继续进行操作,它应该提供解决您问题的蓝图。

于 2013-08-18T18:13:39.860 回答