逐行读取文本并在Python中将每个元素存储在不同的数组中

时间:2013-07-30 16:24:54

标签: python arrays file-io

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

4 个答案:

答案 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]