在我所说的目录中,有30个txt文件,每个文件包含两列数字,每列大约有6000个数字。我想要做的是导入前3个txt文件,处理给我所需输出的数据,然后我想移动到接下来的3个txt文件。
目录如下:
file0a
file0b
file0c
file1a
file1b
file1c ...等等。
我不想同时导入所有的txt文件,我想导入前3个,处理数据,然后是下一个3等等。我正在考虑制作一本字典 - 虽然我有一种感觉,这可能涉及在字典中写下每个文件名,这将花费太长时间。
编辑:
对于那些感兴趣的人,我想我已经想出了一个解决方案。任何反馈都会非常感激,因为我不确定这是最快捷的做事方式还是最狡猾的方式。
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个文本文件。
答案 0 :(得分:1)
首先,我没有任何原创内容可以包含在这里,我绝对不想要归功于它,因为它全部来自 Python Cookbook 3rd Ed 并且来自{{3 David Beazley(前面提到的 Cookbook 的共同作者之一)。但是,我认为您可能真的会受益于生成器幻灯片中给出的示例。
Beazley所做的是将一堆发电机组合在一起,以便做到以下几点:
所有这些代码示例都位于wonderful presentation on generators。这种方法的优点在于,链式生成器只是简单地咀嚼next
条信息:它们不会将所有文件加载到内存中以便处理所有数据。这真的是一个很好的解决方案。
无论如何,如果你通过幻灯片阅读,我相信它会给你一个蓝图,确切地说你想做什么:你只需要根据你想要的信息进行更改。
简而言之,请查看上面链接的幻灯片,然后跟进,它应该提供解决问题的蓝图。
答案 1 :(得分: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