我有一个带数字的.dat文件。在第一行中,此文件有五列,在随后的所有行中,它都有四列。我希望能够使用numpy读取此文件。我目前尝试读取此文件时遇到以下错误:
vue inspect
如何使用python读取文件的所有行(第一行除外)? 我已附上示例文件here。
此外,此文件的第一列(减去第一行)的行数为n ^ 2(在示例中,我有n = 3,并且该列的条目为1,2,3,4,5, 6,7,8,9)。我想阅读第一列(减去第一行)并将其保存为文本文件,其形状为(n,n)(即文本文件应具有n行和n列)。也就是说,我希望保存的矩阵具有以下顺序的条目:
In [3]: F1 = np.loadtxt(‘file.dat')
---------------------------------------------------------------------------
ValueError Traceback (most recent
call last)
<ipython-input-3-c0f31adaf29a> in <module>()
----> 1 F1 = np.loadtxt(‘file.dat')
/Users/usr/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.pyc in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin, encoding)
1090 # converting the data
1091 X = None
-> 1092 for x in read_data(_loadtxt_chunksize):
1093 if X is None:
1094 X = np.array(x, dtype)
/Users/usr/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.pyc in read_data(chunk_size)
1014 line_num = i + skiprows + 1
1015 raise ValueError("Wrong number of columns at line %d"
-> 1016 % line_num)
1017
1018 # Convert each value according to its column and store
ValueError: Wrong number of columns at line 2
感谢您的帮助。
答案 0 :(得分:2)
要做的一些实验:(未优化) 1.阅读文件中的行:
编辑:'file.dat'文件具有空行。 if line.strip()...
子句用于处理空行。
with open('file.dat', 'r') as fhand:
file_lines = [line[:-1] for line in fhand if line.strip() != ''] # remove the last character '\n'. **Remove empty lines**.
如果您不喜欢第一行,请将其删除。
file_lines.pop(0)
现在剩余的行具有相同数量的数字条目列,您可以在每行中拆分条目,并进行类型转换:
mat_raw = [[float(term) for term in line.split()] for line in file_lines]
然后您将获得一个浮点矩阵。为了方便切片,将其转换为numpy数组。
mat = numpy.array(mat_raw)
# then you can do whatever you like. eg: first column
first_col = mat[:, 0]
# reshape it to n by n matrix:
res = first_col.reshape((n, n))
...
根据文件格式和目标,可以优化此代码以供自己使用。