我有以下contacts.txt文件:
0, 0.989246526088, 0.762584552317, 0.989246526088, 0.989246526088, 5, 2, 20, 91, 114, 127
1, 0.832366089749, 0.67518676348, 0.832366089749, 0.832366089749, 3, 6, 24, 114
2, 0.923079422275, 0.798673866486, 0.923079422275, 0.923079422275, 5, 0, 65, 73, 91, 114
3, 0.0820269441841, 0.879379910489, 0.0820269441841, 0.0820269441841, 3, 71, 91, 120
4, 0.449863833595, 0.985883232333, 0.449863833595, 0.449863833595, 3, 16, 69, 104
6, 0.887055481253, 0.623261413511, 0.887055481253, 0.887055481253, 5, 1, 25, 87, 100, 114
7, 0.111156294437, 0.255444048959, 0.111156294437, 0.111156294437, 3, 19, 83, 111
9, 0.514040361142, 0.373030232483, 0.514040361142, 0.514040361142, 4, 38, 59, 72, 76
11, 0.597169587765, 0.0286747230467, 0.597169587765, 0.597169587765, 3, 56, 101, 108
12, 0.89754811115, 0.361667992685, 0.89754811115, 0.89754811115, 3, 86, 92, 126
13, 0.571528472894, 0.860250953547, 0.571528472894, 0.571528472894, 5, 30, 79, 82, 101, 104
14, 0.593696200969, 0.680733858699, 0.593696200969, 0.593696200969, 3, 78, 103, 124
依此类推16383或16384行,具体取决于文件。
我尝试了以下代码
with open('contacts.dat') as infile:
n, x, y, z, radius, contact_number = [[int(num) for num in line.strip().split()[:5]] for line in infile]
neighbours = [[int(num) for num in line.strip().split()[5:]] for line in infile]
它似乎不起作用。
我正在寻找的是,对于文件的每一行,以下内容存储在不同的数组中:
PER LINE
n
(其中 - >表示“存储在数组中”)x
y
z
radius
contact_number
neighbours
答案 0 :(得分:1)
列表理解存在一些问题 - 首先,您要创建一个列表列表(包含数千个条目)并尝试将此列表分配给六个变量。更好地使用循环代替。另请注意,您正在将所有内容都转换为int
,而某些值实际上是float
s,但无论如何都会失败,因为分割线中仍然包含逗号。
由于您的文件包含以逗号分隔的值,因此我建议您使用csv
模块。这将照顾分裂和逗号剥离的东西。此外,不是使用一个大型列表理解,而是单独或成组提取值可能更具可读性。
import csv
with open("contacts.dat") as infile:
for line in csv.reader(infile):
num = int(line[0])
x, y, z, radius = map(float, line[1:5])
contact = int(line[5])
neighbors = map(int, line[6:])
现在提取了各个值,剩下要做的就是将它们存储在某些数据结构中,例如,字典列表,名称元组或某些特殊类。
答案 1 :(得分:0)
您正在尝试存储输入的列,但解压缩会给出行。首先转置它:
def transpose(grid):
return zip(*grid)
答案 2 :(得分:0)
替代方法:NumPy
import numpy as np
nparray = np.genfromtxt('contacts.txt',delimiter = ',')
#Where column N is accessed by nparray[:,n]
答案 3 :(得分:0)
另一种仅使用内置函数读取文件的方法..
def atonum(x):
if x.find('.') < 0: return int(x)
return float(x)
with open(filename) as infile:
alldata=[[ atonum(y) for y in x.strip().split(',') ] for x in infile]