我正在尝试使用python加载文件,但我不想一次加载它。我有一个错误,我不知道如何解决它。
这是代码:
import numpy as np
from itertools import islice
with open('C:/Users/jack/Desktop/folder/a.txt') as f:
while True:
next_n_lines = np.loadtxt(islice(f, 2))
if (next_n_lines.any()==0):
break
a = next_n_lines[:, 0:2]
b = next_n_lines[:, 2:4]
print(a)
print(b)
这是输出:
[[ 1. 2.]
[ 2. 3.]]
[[ 3. 4.]
[ 4. 5.]]
[[ 3. 4.]
[ 4. 5.]]
[[ 5. 6.]
[ 6. 7.]]
[[ 5. 6.]
[ 6. 7.]]
[[ 7. 8.]
[ 8. 9.]]
Traceback (most recent call last):
File "C:\Users\jack\Desktop\folder\a.py", line 9, in <module>
a = next_n_lines[:, 0:2]
IndexError: too many indices for array
这是我正在加载的文件:
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
答案 0 :(得分:1)
据我了解,你的加载文件中缺少一行,因此无法创建最后两个数组。
以下是一次加载两行的方法:
import numpy as np
from itertools import islice
with open(r'C:\\path\\to\\file\\a.txt') as f:
while True:
try :
line1 = next(f)
line2 = next(f)
except StopIteration:
break
a1 = np.loadtxt(islice(line1.split(' '), 2))
a2 = np.loadtxt(islice(line2.split(' '), 2))
a = np.array([a1,a2])
b1 = np.loadtxt(islice(line1.split(' '), 2, 4))
b2 = np.loadtxt(islice(line2.split(' '), 2, 4))
b = np.array([b1,b2])
print(a)
print(b)
f
是一个迭代器,因此您可以调用next
方法来获取迭代器的下一个值。您可以将代码概括为一次读取n
行。
输出结果为:
[[ 1. 2.]
[ 2. 3.]]
[[ 3. 4.]
[ 4. 5.]]
[[ 3. 4.]
[ 4. 5.]]
[[ 5. 6.]
[ 6. 7.]]
[[ 5. 6.]
[ 6. 7.]]
[[ 7. 8.]
[ 8. 9.]]
答案 1 :(得分:0)
如果您需要一种有效访问文件任何行的备用且更标准的方法,您可以检查标准库提供的linecache模块。即使您无法访问contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
ANDROID_EXTRA_LIBS = \
$$PWD/../../Android/openssl-1.0.2k/libcrypto.so \
$$PWD/../../Android/openssl-1.0.2k/libssl.so
}
contains(ANDROID_TARGET_ARCH,x86) {
ANDROID_EXTRA_LIBS = \
$$PWD/../../OpenSSL/libcrypto.so \
$$PWD/../../OpenSSL/libssl.so
}
,这也具有工作优势。
答案 2 :(得分:0)
首先确保您了解切片和加载文件产生的内容。然后你可以担心分割数据:
In [150]: with open('stack46580159.txt') as f:
...: while True:
...: data = np.loadtxt(islice(f,2))
...: print(data)
...: if (data.any()==0):
...: break
...:
[[ 1. 2. 3. 4.]
[ 2. 3. 4. 5.]]
[[ 3. 4. 5. 6.]
[ 4. 5. 6. 7.]]
[[ 5. 6. 7. 8.]
[ 6. 7. 8. 9.]]
[ 7. 8. 9. 10.]
/usr/local/bin/ipython3:3: UserWarning: loadtxt: Empty input file: "<itertools.islice object at 0xab79bc84>"
# -*- coding: utf-8 -*-
[]
你有奇数行。因此,最后一个切片只向一行提供loadtxt
(加上警告)。 loadtxt
返回1d数组,而不是您期望的2d。
一个简单的解决方法是在切片之前确保data
为2d
In [155]: with open('stack46580159.txt') as f:
...: while True:
...: data = np.loadtxt(islice(f,2))
...: data = np.atleast_2d(data)
...: print(data)
...: if (data.any()==0):
...: break
...: data[:,:2]
...:
[[ 1. 2. 3. 4.]
[ 2. 3. 4. 5.]]
[[ 3. 4. 5. 6.]
[ 4. 5. 6. 7.]]
[[ 5. 6. 7. 8.]
[ 6. 7. 8. 9.]]
[[ 7. 8. 9. 10.]]
还有其他方法可以遍历文件,或者将其全部加载然后拆分。但请确保您了解每一步的进展情况。不要假设。