-1

我有以下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]  

它似乎不起作用。

我正在寻找的是,对于文件的每一行,将以下存储到不同的数组中:

每行

  • 第零个元素 --> n(其中 --> 表示“存储在数组中”)
  • 第一个元素 -->x
  • 第二个元素-->y
  • 第三个元素 -->z
  • 第四个元素 -->radius
  • 第五个元素 -->contact_number
  • 该行的剩余元素(如果有)-->neighbours
4

4 回答 4

1

您的列表理解存在一些问题——首先,您正在创建一个列表列表(包含数千个条目)并尝试将此列表分配给六个变量。最好使用循环。另请注意,您将所有内容都转换为int,而某些值实际上是floats,但无论如何转换都会失败,因为分割线中仍然有逗号。

由于您的文件包含逗号分隔的值,我建议使用该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:])

现在提取了各个值,剩下要做的就是将它们存储在一些数据结构中,例如字典列表、名称元组或一些特殊类。

于 2013-07-30T16:41:12.250 回答
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]

于 2013-07-30T18:13:02.037 回答
0

您正在尝试存储输入的列,但解包给出了行。先转置:

def transpose(grid):
    return zip(*grid)
于 2013-07-30T16:28:31.623 回答
0

替代方法:NumPy

import numpy as np
nparray = np.genfromtxt('contacts.txt',delimiter = ',')
#Where column N is accessed by nparray[:,n]
于 2013-07-30T16:31:37.817 回答