【问题标题】:Python nested for loop to split a file into lines then each line into variablesPython嵌套for循环将文件拆分为行,然后将每行拆分为变量
【发布时间】:2013-07-26 09:58:10
【问题描述】:

我需要读取一个包含多个数据行的文件,如下所示:

1 D 65.33383 BAZ 308.1043 Year 2001 Month 01 Day 01 Lat 6.90 Long 126.58 Mag 6.4 Origin Time 06:57:04.2

我需要将文件拆分成行,我已经这样做了,然后将每一行拆分成每个空间的变量。

到目前为止,我使用的嵌套循环如下所示:

for line in open("filename", 'r').readlines():
 variable = string.split(line)

 values = [variable]
 for value in values
 value = string.split(' ')
 year, month = value[0], value [1]

我的问题是我不知道第二个 for 循环中的部分需要是什么?即对于 ... 在 ...

我对 python 编程很陌生。

【问题讨论】:

  • 你的意思是每对两个词都是一个键值对?为什么不用字典?
  • 该格式在Origin Time 键中使用空格。你确定没有那种格式的标签吗?这至少会使项目更容易解析。
  • 我认为Origin Time 06:57:04.2 显示不能单独依赖str.split() 来拆分变量名称和值。数据行开头的 1 是干什么用的?

标签: python loops for-loop split nested


【解决方案1】:

我不完全确定您到底要完成什么,特别不清楚的一件事是您的表达:“然后将每一行拆分为每个空格处的变量”。

但是假设您需要获取包含一个字典列表的输出,每个字典都包含来自该行的解析数据,那么以下内容应该对您有用:

data = []
with open("file.txt") as f:
    for line in f:
        lineData = {}
        lineSplit = line.split()
        for i in range(1,len(lineSplit)-1,2):
            lineData[lineSplit[i]] = lineSplit[i+1]
        data.append(lineData)
print data

这将为您提供如下所示的输出:

[{'Origin': 'Time', 'D': '65.33383', 'BAZ': '308.1043', 'Long': '126.58', 'Month': '01', 'Mag': '6.4', 'Year': '2001', 'Lat': '6.90', 'Day': '01'}]

字典未排序,因此键和值以随机顺序出现。请注意,Origin time 成为键和值,因为您想在空间上分割线,并且在 origin 和 time 之间有一个空格。干杯!

【讨论】:

  • 抱歉不清楚。我想在以后使用的原始文件中的某些行部分。因此,对于我拆分的每一行,我需要再次拆分以获取一些值。因此,一旦我第二次拆分,我需要为这些部分分配一个名称。谢谢
  • 好的,你能举个例子说明你的最终输出应该是什么样子吗?
  • 没有输出。我想获取 lat、long(以及其他一些)的值,然后将它们插入 java 客户端以下载数据。所以最终程序应该形成如下一行: java -jar GeoNetCWBQuery-4.0.2-bin.jar -s "NZ.....HH..." -d 3600 -event:time "2008/07/ 05 02:12:05" -event:lat "53.88" -event:lon "152.89" -event:depth "632" 其中 "" 中的每个值都取自原始文件,然后在 konsole 命令中运行行。
  • 好吧,我不知道如何将东西插入到 java 客户端,但是对于 Python 字典,如果你有类似于上面的 Python 字典,你可以通过 lineData[ "Long"] 或 lineData["Month"] (但如果字典在列表中,你当然必须循环它们)等等。
  • 感谢您的帮助!
【解决方案2】:

在这种情况下,使用正则表达式可能是最简单的,因为您的某些条目包含空格。

以下表达式查找任何非数字的内容,然后是仅由数字、点和冒号组成的内容:

import re
key_val = re.compile(r'\s*([^\d]+)\s+([\d.:]+)\s*')

mapping = dict(key_val.findall(line))

这会产生一个字典对象:

>>> import re
>>> line = '1 D 65.33383 BAZ 308.1043 Year 2001 Month 01 Day 01 Lat 6.90 Long 126.58 Mag 6.4 Origin Time 06:57:04.2\n'
>>> key_val = re.compile(r'\s*([^\d]+)\s+([\d.:]+)\s*')
>>> key_val.findall(line)
[('D', '65.33383'), ('BAZ', '308.1043'), ('Year', '2001'), ('Month', '01'), ('Day', '01'), ('Lat', '6.90'), ('Long', '126.58'), ('Mag', '6.4'), ('Origin Time', '06:57:04.2')]
>>> dict(key_val.findall(line))
{'D': '65.33383', 'BAZ': '308.1043', 'Long': '126.58', 'Month': '01', 'Origin Time': '06:57:04.2', 'Mag': '6.4', 'Year': '2001', 'Lat': '6.90', 'Day': '01'}

【讨论】:

    【解决方案3】:
    with open('data.txt', 'r') as data:
        for _input in data:
            line = _input.split(' ')
            data = {'Index':line[0],
                    'Origin Time':line[-3:][-1].strip()
                    }
            data.update(dict(zip(line[1:-3][0::2], line[1:-3][1::2])))
            print data
    

    【讨论】:

    • 你能给我举个例子吗?
    • 我错了,你不需要 pyparsing。在编辑后的答案版本中使用代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多