【问题标题】:Trying to input data from a txt file in a list, then make a list, then assign values to the lines尝试从列表中的 txt 文件输入数据,然后制作列表,然后将值分配给行
【发布时间】:2013-08-05 13:04:47
【问题描述】:
allt = []
with open('towers1.txt','r') as f:   
    towers = [line.strip('\n') for line in f]
    for i in towers:
        allt.append(i.split('\t'))
    print allt [0]

现在我需要帮助,我正在输入此文本

mw91 42.927 -72.84 2.8
yu9x 42.615 -72.58 2.3
HB90 42.382 -72.679 2.4

当我输出时我得到了

['mw91 42.927 -72.84 2.8']

我的代码在哪里以及我可以使用哪些函数来定义此列表中的第一个、第二个、第三个和第四个值以及下面将输出的所有值,我正在尝试

allt[0][2] or 
allt[i][2] 

但是这给我-72.84,它是一个错误,然后其他时候它去列表没有属性拆分

更新,也许我需要使用枚举?我需要确保虽然我输入的中间 2 个值可以使用,但可以使用数字而不是字符串,因为我用数学减去它们

【问题讨论】:

  • 而不是 allt.append(i.split('\t')) 尝试 allt.append(i.split(' '))
  • 不,整个事情都变得疯狂了,我从左边开始得到 20 行输出,下一列是 19 行,然后是 18 行,以此类推,直到最右边的列有 1 行 @smac89跨度>

标签: python string list append


【解决方案1】:

[] 表示一个列表。

'' 表示一个字符串。

allt = ['mw91 42.927 -72.84 2.8']

allt 是一个包含字符串的列表:

allt[0] --> 'mw91 42.927 -72.84 2.8'

allt[0][2] --> '9'

allt.split() --> ['mw91', '42.927', '-72.84', '2.8']

allt.split()[2] --> '-72.84' #这仍然是一个字符串。

float(allt.split()[2]) --> -72.84 #现在是一个浮点数。

【讨论】:

    【解决方案2】:

    你确定那些是标签吗?您可以不为 split 指定任何参数,它会自动在空格上拆分(这意味着您也不必事先删除换行符)。我将您的示例复制到一个文件中并让它像这样工作:

    allt = []
    with open('towers1.txt','r') as f:   
       for line in f:
            allt.append(line.split())
    
    >>>print allt[0]
    ['mw91', '42.927', '-72.84', '2.8']
    >>>print allt[0][1]
    '42.927'
    

    脚注:如果您摆脱了第一个列表理解,那么您只需迭代文件一次,这样会减少浪费。


    刚刚看到您也需要转换浮点值的帮助。假设line.split() 正确拆分数据,类似以下的内容可能会起作用:

    allt = []
    with open('towers1.txt','r') as f:   
       for line in f:
             first, *_else = line.split() #Python3
             data = [first]
             float_nums = [float(x) for x in _else]
             data.extend(float_nums)
             allt.append(data)
    
    >>>print allt[0]
    ['mw91', 42.927, -72.84, 2.8]
    

    对于 Python2,将 first, *_else = line.split() 替换为以下内容:

    first, _else = line.split()[0], line.split()[1:]
    

    最后(响应下面的 cmets),如果您想要一组特定值的列表,您将不得不再次迭代,这就是列表推导可能有用的地方。如果您想要allt 中每个元素的[2] 索引值,则必须执行以下操作:

     >>> some_items = [item[2] for item in allt]
     >>> some_items
     [-72.84, -72.58, -72.679]
    

    【讨论】:

    • 我唯一的问题是,当我输入说 print allt[2] 我希望它在下一行代码中打印使用我在第三个文件中的所有 20 行文本点。 IE。高于 -72.84 -72.58 然后 -72.679 再次
    • 我不确定我是否理解,但听起来您想为每一行值打印一个特定的列(这是根据请求的输入显示的样子)。如果是这样,你总是不得不循环。 (我会在上面举一个例子)。
    • 也谢谢,(first, *_else) 是一个错误,代码中的第 4 行,在我的 comp 中。它说在 *
    • 啊,那是我没想到的 Python3 东西。您可以尝试改用以下内容:first, _else = line.split()[0], line.split()[1:]
    • 所以如果我得到一个集合中的 item1 和 item2 并将它们输入到一个函数中并且我得到返回的值,那么 item1 和 item2 会知道它们来自哪个 item0 吗??
    【解决方案3】:

    我认为这也应该有效

    with open('towers.txt', 'r') as f:
        allt = map(str.split, f)
    

    如果你需要第一个之后的值是浮动的......

    with open('towers.txt', 'r') as f:
        allt = [line[:1] + map(float, line[1:]) for line in map(str.split, f)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多