我需要打开数百个* .txt文件。每个文本文件都有4个坐标(x y):
401 353
574 236
585 260
414 376
我需要阅读每一个以便进行简单的计算。到目前为止我所拥有的是:
import sys,os
if __name__ == '__main__':
if len(sys.argv) > 1:
path = sys.argv[1]
else:
path = os.getcwd() + '/'
try:
filt = set([".txt", ".TXT"])
sortlist = []
sortlist = os.listdir(path)
sortlist.sort()
for item in sortlist:
fileType = item[-4:]
if fileType in filt:
CurrentFile = open(item, 'r')
TextInCurrentFile = CurrentFile.read()
print TextInCurrentFile # Printing textfiles content.
except Exception, e:
print e
首先,它没有正确排序文件。我更喜欢数字和字母数字。
但我主要担心的是如何定义定义:(X0,Y0,X1,Y1,X2,Y2,X3,Y3)
是否可以从具有相同文件名的另一个文件中读取,该文件位于计算中包含的另一个文件夹中。我将对每个文件进行一些比较并记录整体结果。
答案 0 :(得分:0)
让我们按步骤解决这个问题。第一步实际上是按顺序获取所需的文件。我喜欢使用glob模块,但是如果你希望你的匹配不区分大小写,那么你将更好地使用re模块。然后可以通过排序函数进行排序。
import os
import re
import fnmatch
rule = re.compile(fnmatch.translate('*.txt'), re.IGNORECASE)
print sorted([fname for fname in os.listdir('.') if rule.match(fname)])
现在,由于数据格式是固定的,您只需使用namedtuple列表来包含数据即可。代码看起来像这样:
import os
import re
import fnmatch
import collections
coords_t = collections.namedtuple('coords_t', ['x0', 'y0', 'x1', 'y1', 'x2', 'y2', 'x3', 'y3'])
data_collection = []
rule = re.compile(fnmatch.translate('*.txt'), re.IGNORECASE)
for fname in sorted([name for name in os.listdir('.') if rule.match(name)]):
with open(fname, 'r') as f:
data = f.read()
data_collection.append(coords_t(*data.replace('\n', ' ').split(' ')[:-1]))
print data_collection
现在,您将数据保存为data_collection变量中的namedtuple列表,您可以执行所需的计算。此外,最好使用with
上下文管理器来处理文件,因为它可以为您处理可能的异常。
它还取决于您想要实现的结果格式,例如,如果您想知道与文件字典相关联的坐标将是比列表更好的选择,使用
{fname: coords_t(*data.replace('\n', ' ').split(' ')[:-1])}
使用namedtuple可以让你感觉良好"使用data_collection[0].x0
等点符号访问它的值。