解析后我得到了损坏的文件

时间:2014-08-25 14:45:37

标签: python matlab parsing io special-characters

我有很多来自分子动力学代码(Lammps)的输出文件,我有一个脚本可以解析文件并从输出文件中计算出一堆参数。每个文件介于4-17MB之间,脚本在大约3分钟内解析这些文件中的768个。文件的格式是文本而不是二进制文件。

问题在于:

脚本在处理4到5个这些文件夹(4~5 * 768)抱怨重塑错误问题后停止。但真正的原因是文本中插入了一堆“特殊字符”而没有任何充分的理由。我确信在解析脚本之前该文件没有被破坏,并且这些字符插入文本内部的唯一原因是实际运行脚本。

脚本是用python编写的,我在下面的命令中使用'r'键来确保脚本没有对文件的写访问权。

fid = open(file_path, 'r') 

我在Matlab中重写了相同的脚本,同样存在问题也让我相信这是一个与我的硬件有关的I / O问题,而不是编码问题。

我在带有ext4格式硬盘和64 GB内存的ubuntu工作站上运行此脚本。 有趣的是,当我在群集上运行相同的脚本时,我无法复制此问题。即使是这个脚本的并行版本在群集上运行也没有问题,但在我的本地机器上却没有。

这是脚本的一部分,它使用打开的文件进行所有读取,文件的其余部分进行计算。最后,我将结果写在一个单独的文件中,这是一个非常小的文件(50 KB)。

        for file_name in list_files:
            if 'dump' in file_name:
                print file_name
                gb_name = dir_list[j]
                gb_num = int(file_name[file_name.find('.')+1:len(file_name)])
                i += 1
                file_path = read_path + '/' + file_name
                fid = open(file_path, 'r', 1)
                junk = fid.readline(); junk = fid.readline(); junk = fid.readline();
                num_lines = int(fid.readline())
                junk = fid.readline()
                if len(junk) > 26:
                    x_lims = map(float, fid.readline().split())
                    y_lims = map(float, fid.readline().split())
                    z_lims = map(float, fid.readline().split())
                    a_tri = abs(x_lims[1] - (x_lims[0]-y_lims[2]))
                    c_tri = abs(z_lims[1] - z_lims[0])
                    gb_area = a_tri * c_tri
                    junk = fid.readline()
                else:
                    x_lims = map(float, fid.readline().split())
                    y_lims = map(float, fid.readline().split())
                    z_lims = map(float, fid.readline().split())
                    gb_area = abs(x_lims[1] - x_lims[0]) * abs(z_lims[1] - z_lims[0])
                junk = fid.readline()
                tmp = fid.readlines()
                fid.close()
                if len(tmp) == num_lines:
                    coords = np.array(map(float, ''.join(tmp).split())).reshape(num_lines, 7)
                    coords[::, 0:2].astype(int)
                else:
                    raise Exception('Number of lines is not consistent with number of data points.')

以下是损坏文件的示例。请注意特殊字符:

99463 2 51.5597 211.814 41.7614k4.26088e-13 -3.35999 
99881 2 52.1696 212.526 39.0575 4.91923e-/ef3 -3.35998 

如果您有类似的经历,请在此留言。

0 个答案:

没有答案