【问题标题】:loading a file python加载文件python
【发布时间】:2017-10-05 07:28:54
【问题描述】:

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

【问题讨论】:

  • 您到底在用numpy 做什么?您可以在没有它的情况下读取文件...
  • 你想如何加载你的文件?你能提供一些样本吗?
  • 我想一次加载文件 n 行,所以我使用 islice 获取一定数量的行并使用 numpy 将这些信息放入数组中。
  • 您是否有一个令人信服的理由来加载每个块的文件块,比如一个巨大的文件大小左右?因为您可以首先以与文件中相同的格式将所有数据加载到数组中,然后再尝试将数据格式化为所需的形状。我会假设它也会更有效率。
  • 您在等待的确切输出是什么?

标签: python file numpy


【解决方案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.]]

【讨论】:

  • 这行得通,但有什么方法可以做到不丢失最后一次迭代?
  • @JackFarah 你能准确地说出你想要的确切输出吗?
  • 我需要的主要不是确切的输出,我需要的是在加载文件时不会丢失任何文件的任何行
  • @JackFarah 你不明白的是你永远不会像你的例子那样用最后一行创建一个矩阵,因为有奇数行。您是否希望最后一行输出为 (1,2) 矩阵?这就是为什么我一直问你想要什么输出:你的问题在这里的人还不清楚......
【解决方案2】:

如果您需要另一种更标准的方式来有效地访问文件的任何行,您可以查看标准库提供的linecache 模块。即使您无权访问 NumPy,这也能正常工作。

【讨论】:

    【解决方案3】:

    首先确保您了解 slice 和 loadtxt 产生的内容。然后你可以担心拆分数据:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2012-05-22
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 2013-01-10
      • 2016-10-26
      • 2014-10-31
      相关资源
      最近更新 更多