打开python文件并附加特定信息

时间:2017-01-15 00:33:27

标签: python-3.x

我有一些来自txt文件的数据数据,我试图将其排序为一个如下所示的列表:

[ALASKA, [2006/10/19, 2.8], [2006/10/18, 2.6], etc etc] 

[MEXICO, [2006/10/20, 2.8], [2006/10/18, 3.3]] for each location without any  tuples or ''


2.8 2006/10/19 02:02:10 62.391 -149.751 15.0 CENTRAL ALASKA

2.5 2006/10/19 00:31:15 20.119 -156.213 1.5 MAUI REGION, HAWAII

5.0 2006/10/18 21:15:51 4.823 -82.592 37.3 SOUTH OF PANAMA

2.6 2006/10/18 21:12:25 59.934 -147.904 30.0 GULF OF ALASKA

3.4 2006/10/18 20:59:21 36.540 -89.640 7.7 SOUTHEASTERN MISSOURI

代码:

def main():

    file = open('data.txt','r')    
    category1 = [[]]   

    for line in file:
        magnitude, date, time, x, y, z, location = line.strip().split(' ')
        locationend = location.split(' ')[-1]
        category1[locationend].append((date,magnitude))

    #print(category1)

 main()

现在我遇到一个错误,其中line.split函数无法解压每行上的所有8个数据,还有另一种方法可以删除项目3:5吗?我知道它可能是列表中的pop函数。

3 个答案:

答案 0 :(得分:0)

str.split包含一个可选的maxsplit参数,用于限制要拆分的值,您可以使用此参数将整个位置名称作为单个项目。现在,您可以使用dict收集每个位置的数据列表。 collections.defaultdict在这里很不错,因为它会自动为新键创建值。现在您有一个日期/幅度对列表,您可以在编写时使用itertools.chain解压缩它们。把它们放在一起,你得到了

import collections
import itertools

def main():
    locations = collections.defaultdict(list)   
    with open('data.txt','r') as file:
        for line in file:
            magnitude, date, time, x, y, z, location = line.strip().split(' ', 6)
            locations[location].append((date, magnitude))
    with open('output.txt', 'w') as outfile:
        for location, data in locations.items():
            outfile.write('{}, {}\n'.format(location, 
                ' ,'.join(itertools.chain.from_iterable(data))))
main()

print(open('output.txt').read())

答案 1 :(得分:0)

此解决方案使用字典来保存每个区域设置的每个事件的列表:

这是因为我没有文件而使用的样本数据:

data = [x.strip() for x in """
    2.8 2006/10/19 02:02:10 62.391 -149.751 15.0 CENTRAL ALASKA
    2.5 2006/10/19 00:31:15 20.119 -156.213 1.5 MAUI REGION, HAWAII
    5.0 2006/10/18 21:15:51 4.823 -82.592 37.3 SOUTH OF PANAMA
    2.6 2006/10/18 21:12:25 59.934 -147.904 30.0 GULF OF ALASKA
    3.4 2006/10/18 20:59:21 36.540 -89.640 7.7 SOUTHEASTERN MISSOURI
    """.split('\n')[1:-1]]

此代码显示如何在保持整个位置的同时浏览数据并将其拆分。在发现整个位置之后,很容易获得该位置的最后一个单词,并保留该位置后缀的每个事件的列表。并非传递给6的{​​{1}}强制它将所有内容保留在剩下的一个字段(位置)中的前五个字段之后:

split()

答案 2 :(得分:0)

这样的事情应该有效:

def process(filename):
    d = {}
    with open(filename, "r") as f:
        for line in f:
            line_contents = line.split()
            if line_contents[-1] in d.keys(): # we already have an entry
                d[line_contents[-1]].append([line_contents[1], line_contents[0]])
            else:
                d[line_contents[-1]] = [[line_contents[1], line_contents[0]]]
    return d

如果愿意,您还可以将每个键的值设置为元组列表。