【问题标题】:Reading 3 columns of data from .txt into list将 .txt 中的 3 列数据读入列表
【发布时间】:2016-09-28 15:59:46
【问题描述】:

您好,我有一个问题。我有以下文本文件(3 列和之间的空格)。我想将每一列(tt,ff,ll)插入到它自己的列表(时间,l,f)中。

文本文件:

   0.0000000000000000     656.5342434532456082       0.9992059165961109
   1.0001828508431749     656.5342334512754405       1.0009810769697651
   2.0003657016863499     656.5342259805754566       0.9989386155502871
   3.0005485525295246     656.5342339081594218       1.0005032672779635
   4.0007314033726997     656.5342356101768928       0.9996101946453564
   5.0009142542158749     656.5342236489159404       0.9986884414684027
   6.0010971050590491     656.5342474828242985       1.0001061182847479
   7.0012799559022243     656.5342355894648563       1.0003982380731031
   8.0014628067453994     656.5342256832242356       0.9993176599964499
   9.0016456575885737     656.5342218575017341       0.9999117456245585
  10.0018285084317498     656.5342408970133192       1.0000973751521087
  11.0020113592749240     656.5342243211601954       0.9997189612768125
  12.0021942101180983     656.5342320396634932       0.9997487346699927
  13.0023770609612743     656.5342291293554808       0.9991986731183715

但我想要以下输出:

time: (0.00,1.00,2.003,4.0007 etc...)
l: (656.53,656.53,656.53,656.53 etc..)
f: (...)

尝试代码:

from numpy import *



def read_file(filename):
   time = [] # list time
   f = [] # ...
   l = [] # ...
   infile = open(filename, "r") # reads file
   for line in infile: # each line in txt file
      numbers = line.split() # removes the " "
      tt = numbers[0] # 1st column?
      ff = numbers[1] # 2nd column?
      ll = numbers[2] # 3rd column?


      time.append(tt) # Inserts 1st column(tt) into list(time) 
      f.append(ff) # ...
      l.append(ll) # ...
      
return time,f,l # return lists

txt1 =read_file("1.txt") # calls function
print txt1 # print return values

【问题讨论】:

  • 我运行了代码并且工作正常。您面临的具体问题是什么?

标签: python list text-files multiple-columns


【解决方案1】:

使用numpy的loadtxt函数

text_array = np.loadtxt('my_file.txt')
time = text_array[:, 0]
l = text_array[:, 1]
f = text_array[:, 2]

【讨论】:

  • 这很好用。此方法会自动忽略空格吗?它与 open(filename, "r") 有何不同?
  • [ 0.00000000e+00 1.00018285e+00 2.00036570e+00 ..., 6.10411594e+03 6.10511612e+03 6.10611630e+03] 得到以下输出:D 谢谢
  • 当您有一个简单的文件,其中数据以类似矩阵的形状存储时,此方法非常有用,因为它使用起来非常简单。有几个可选参数来处理标题等;你可以查看help(numpy.loadtxt)
【解决方案2】:

我刚刚尝试了您的代码,它可以正常工作,返回一个列表元组。如果您的问题是如何将这个列表元组转换为您请求的格式(由于数据量的原因,这将非常笨拙),您可以使用 txt1 变量将其添加到末尾:

(已编辑以包含换行符)

print ("time: ({})\nl: ({})\nf: ({})".format(*[','.join(i) for i in txt1]))

这用逗号连接每个列表,并使用解包运算符 (*) 将它们分隔为 format 函数的三个参数。

我喜欢使用numpy 的功能来处理文件的另一个答案。您也可以使用内置函数以这种方式执行此操作(请注意,这会返回一个元组列表):

def read_file(filename):
  with open(filename, 'r') as f:
    return zip(*[line.split() for line in f])

【讨论】:

  • 我只想在一个列表中插入一列。当缩进时,我收到以下错误消息: Traceback (most recent call last): File "1c4.py", line 23, in star1 =read_file("star1_1.10.txt") # calls function File "1c4. py",第 13 行,在 read_file tt = numbers[0] # 第一列? IndexError: 列表索引超出范围
  • @J.Doe 当我运行 sn-p (当然是修复返回缩进)时,它对我有用。如果您需要帮助调试此消息,则必须使用您所做的任何更改来更新您的 sn-p - 似乎您修改了 numbers 列表的长度为 0。
【解决方案3】:

您的return 语句当前缩进不正确。当我纠正它似乎工作时。

一个更简单的方法可能是

def read_file(filename):
    infile = open(filename, "r") # reads file
    rows = [line.split() for line in infile]
    return [r[i] for r in rows for i in range(3)] # return lists

【讨论】:

    猜你喜欢
    • 2022-07-17
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多