1

我正在尝试从 Python 中的 txt 文件导入和排列。

该文件是一堆数组或“列表”我不确定术语基本上每个数组都包含15到30左右的不同数量的整数。

我尝试的任何方法都只读取每行,但这对我不起作用,因为一个数组跨越 4 行,我需要读取每个数组作为一个整体。

数据格式如下:

  9     10     11     12     13     14     15     16     17     18
  19     20     21     22     23     24     89     90     91     92
  93     94     95     96   8447   8448   8449   8450   8451   845
 8453   8454   8488   8489   8490 164624 164625 164626 164627 164628
 164629

 13     14     15     16     17     18     19     20     21     22
 23     24     25     26     27     28     91     92     93     94
 95     96     97     98   8449   8450   8451   8452   8453   8454
8455   8456   8488   8489   8490   8491 164626 164627 164628 164629
164630 164631 164632 164633 164666 164667 164668

17     18     19     20     21     22     23     24     25     26
 27     28     29     30     31     32     93     94     95     96
 97     98     99    100   8451   8452   8453   8454   8455   8456
8457   8458   8489   8490   8491   8492 164628 164629 164630 164631
164632 164633 164634 164635 164666 164667 164668

21     22     23     24     25     26     27     28     29     30
 31     32     33     34     35     36     95     96     97     98
 99    100    101    102   8453   8454   8455   8456   8457   8458
8459   8460   8490   8491   8492   8493 164630 164631 164632 164633
164634 164635 164636 164667 164668 164669 164670

我是生成此文件的人,因此无论如何我都可以对其进行更改,以使其更简单。

我试过了 -

readlines genfromtxt loadtxt

任何我能找到的任何输出,我可以得到每行的工作输出,所以第一个条目是:

9 10 11 12 13 14 15 16 17 18

相对于:

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 89 90 91 92 93 94 95 96 8447 8448 8449 8450 8451 845 8453 8454 8488 8489 8490 164624 164625 164626 164627 164628 164629

这是用于生成输出文件的代码:

for i in c_array:
n_array = []
for j in i:     
    for k in range(8):
        a = []
        sorted_c_array = sorted_c_arrays[k]
        c_col = sorted_c_array[:,k]
        b = (binarySearch(c_col,j,sorted_c_array))
        if b == True: 
            n_array.append(np.array(a))
        else:
            continue
n_array = np.reshape(n_array,(1,(np.size(n_array))))
n_array = np.unique(n_array)
output.writelines(str(n_array).replace(']',']\n')) code here

使用这个:

c_array = []
a = []
for l in file("C:/Users/09432191/SkyDrive/Masters/python/Finished programs/Pre-  Prosessing/current_conectivity2.dat"):
line = l.strip()
if l == "\n" :
    c_array.append(a)
    a = []
a.append(line)

print c_array[0]

我得到了,我无法弄清楚如何摆脱不需要的字符:

['[     9     10     11     12     13     14     15     16     17     18', '19     20     21     22     23     24     89     90     91     92', '93     94     95     96   8447   8448   8449   8450   8451   8452', '8453   8454   8488   8489   8490 164624 164625 164626 164627 164628', '164629]']
4

3 回答 3

2

这可能不是一种有效的方法,但看看:

FILE = open("example.txt","r")
mystr = ""

for line in FILE:
    mystr = mystr + line

myarray = mystr.split("\n\n")
myarraylist = list()

for arraystr in myarray:
    arraystr = arraystr.strip('\n')
    arraystr = myarraylist.append(arraystr.split())

print myarraylist

这输出:

[['9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '89', '90', '91', '92', '93', '94', '95', '96', '8447', '8448', '8449', '8450', '8451', '845', '8453', '8454', '8488', '8489', '8490', '164624', '164625', '164626', '164627', '164628', '164629'], ['13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '91', '92', '93', '94', '95', '96', '97', '98', '8449', '8450', '8451', '8452', '8453', '8454', '8455', '8456', '8488', '8489', '8490', '8491', '164626', '164627', '164628', '164629', '164630', '164631', '164632', '164633', '164666', '164667', '164668'], ['17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '93', '94', '95', '96', '97', '98', '99', '100', '8451', '8452', '8453', '8454', '8455', '8456', '8457', '8458', '8489', '8490', '8491', '8492', '164628', '164629', '164630', '164631', '164632', '164633', '164634', '164635', '164666', '164667', '164668'], ['21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '95', '96', '97', '98', '99', '100', '101', '102', '8453', '8454', '8455', '8456', '8457', '8458', '8459', '8460', '8490', '8491', '8492', '8493', '164630', '164631', '164632', '164633', '164634', '164635', '164636', '164667', '164668', '164669', '164670']]
于 2013-11-06T10:53:18.633 回答
2

如果只需要使用 Numpy 访问文件,可以使用np.savenp.load. 这以更方便的格式存储数据:不需要从整数到字符串的转换,反之亦然,这比使用文本文件快得多。代码也变得非常简单明了:

import numpy as np

arr = np.random.randint(1, 200000, (180000, 47))

np.save('test.npy', arr)  # 250 milisec on my system
loaded_arr = np.load('test.npy')  # 55 milisec on my system


# alternatively using text based files:
np.savetxt('test.txt', arr)  # 19 seconds
loaded_arr = np.loadtxt('test.txt', dtype=np.int)  # 32 seconds

这样您就没有 180000 个单独的数组,而是一个大数据结构,您可以在其中通过切片访问每个(子)数组。但是,当您保存数据时,它应该是一个单独的 2D 数组,但调整代码以这种格式保存数据应该不难(如果每个子数组至少具有相同的大小)。

于 2013-11-06T14:12:27.433 回答
0

读回这些数据的一种简单方法是逐行读取并将值累积到一个数组中,我们称之为“行”。然后,当我们读取一个空行时,我们只需将该行附加到结果数组并清除当前“行”。如果我们想处理文件不以空行结尾的情况,那么我们必须明确地处理这种情况:

res = []
row = []
for l in file('/tmp/data.txt'):
    line = l.strip().split()
    if not line:
        res.append(row)
        row = []
    else:
        row.extend(line)
res.append(row)

print res

如果您愿意,您可以在扫描时使用数据,而不是将其加载到内存中。允许程序的其他部分决定是否将整个数据加载到内存中并且不必更改读取方式的简单方法是使用 python 生成器:

def parseRows(f):
    res = []
    row = []
    for l in file('/tmp/data.txt'):
        line = l.strip().split()
        if not line:
            yield row
            row = []
        else:
            row.extend(line)


for r in parseRows('/tmp/data.txt'):
    print r

parseRows 的结果是一个“生成器”,一个可以像列表一样迭代的对象,但会延迟计算它的值。

于 2013-11-06T11:32:04.100 回答