加载文件python

时间:2017-10-05 07:28:54

标签: python file numpy

我正在尝试使用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

3 个答案:

答案 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.]]

还有其他方法可以遍历文件,或者将其全部加载然后拆分。但请确保您了解每一步的进展情况。不要假设。