【问题标题】:analyzing a txt file in python by jumping the n_th element of a list通过跳转列表的第n个元素来分析python中的txt文件
【发布时间】:2012-04-15 16:47:25
【问题描述】:

我无法解析包含如下行的 txt 文件:

50.0 0.1 [0.03, 0.05, 0.067, 1.003, ...]
50.0 0.134 [0.3465, 0.5476, 1.0, ....]
.
.
.

我不需要每行的开头,只需要列表!列表中的元素包含相同数量的字符,它们由空格和逗号分隔。

我想要做的是忽略每个列表前面的任何内容并跳转到(例如)列表的第 9 个元素,读取值并保存它。然后转到下一行并执行相同的操作。

我的方法:

找到一种方法将 txt 行解析为列表而不是字符串,这样我就可以处理列表中的元素。

设法跳到列表中的第 9 个值,然后读取所有内容,直到下一个值(在本例中为第 10 个)。

任何想法如何做到这一点?

【问题讨论】:

  • 还没有,但我现在就要这样做了;)

标签: python file extract text-files seek


【解决方案1】:

当你有这种形式的每一行时:

line = '50.0 0.1 [0.03, 0.05, 0.067, 1.003]\n'

首先删除字符串中不需要的部分。找到 '[' 和 ']' 并使用切片。

line[line.index('[')+1:line.index(']')]

用分隔符分割剩余的字符串(现在:',')。你得到一个字符串列表。

line[line.index('[')+1:line.index(']')].split(',')

取出第 n 个元素并使用 float() 或 eval() 对其进行转换。

float(line[line.index('[')+1:line.index(']')].split(',')[3])  

如果您需要列表中的更多元素,则使用 '[' 和 ']' 评估字符串并获得一个列表。 (注意:eval() 很慢。)

eval('[0.03, 0.05, 0.067, 1.003]')  

代码将与此类似:

with open('datas.txt') as f:
    n = 8
    for line in f:
        a = float(line[line.index('[')+1:line.index(']')].split(',')[n])  
        do_something_with(a)

【讨论】:

    【解决方案2】:

    由于你的问题没有很好的形成,我会尝试以更广泛的方式回答

    1. Read the file linearly.
    2. 如果您的数据格式是统一的,即 一个。方括号在开头和结尾。 湾。数字用空格隔开

      使用 strip 删除任何尾随空格和/或换行符 将其切片以删除第一个和最后一个字符。

      instr="[0.03 0.05 0.067 1.003]"[1:-1]

      使用split() 将字符串拆分为数字列表。

    3. 索引列表以访问第 9 个元素
    4. 保存或做任何你想做的计算

    【讨论】:

    • 对不起,我误导了你......这不仅仅是列表,每一行都有一个开头(我不需要)。我更新了我的问题!
    【解决方案3】:

    如果您需要读取文件并提取每行的第 9 个元素,则需要执行以下操作:

    with open('your_file.txt') as in_file:
    
        my_list = [line.split()[9] for line in in_file]
    

    【讨论】:

    • 我的问题发生了一些变化,现在我在每行的开头有两个数字。知道如何剥离每一行,所以我只有列表吗?谢谢
    【解决方案4】:

    假设文本文件结构与发布的完全相同。

    def openFile(file):
        "Usage: list = openFile(filename)"
        try:
            linesList = []
            inputFile = open(file, "r")
            tempList = inputFile.readlines()
            inputFile.close()
            for line in tempList:
                linesList.append(line.replace("[","").replace("]","").split())
            return linesList
        except:
            print("Could not open file!")
    
    def saveFile(file, data, element):
        "Usage: saveFile('text.txt',myList,9)"
        outputFile = open(file, "w")
        for line in data:
            outputFile.write(line[element-1] + "\n")
        outputFile.close()
    
    
    
    def main():
        myList = openFile("text.txt")
        #now you have a list of lists :D
        #you can do what ever you want with the data
        print(myList)
        saveFile("text2.txt",myList,2)
    
    main()
    

    【讨论】:

      【解决方案5】:

      要删除一行中直到列表开头的字符,一种方法是获取以左括号字符开头的行的切片。这将如下所示:

      line = line[line.index('['):]
      

      然后您可以使用 split() 或 eval() 函数处理字符串,将其转换为列表并从该点检索元素。

      line = line[line.index('['):].split()[9]
      

      【讨论】:

      • 听起来是一个很好的解决方案,它几乎可以工作,只剩下一个小问题:如果我按照你的建议做,我仍然有一个元素末尾的逗号!我如何摆脱那个逗号?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多