我正在尝试从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]']
答案 0 :(得分: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']]
答案 1 :(得分:2)
如果您只需要使用Numpy访问该文件,则可以使用np.save
和np.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数组,但不应该难以调整您的代码以此格式保存数据(如果每个子数组至少具有相同的大小)。
答案 2 :(得分: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的结果是一个“生成器”,一个可以像列表一样迭代的对象,但是懒惰地计算它的值。