Python:打印匹配之间的所有文件行

2024-06-16 11:16:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个“pythonic”的解决方案来解决一个相当简单的问题,但我似乎还不能完全理解这个问题。你知道吗

我有一个输入文件,就像我在下面取样的那个:

Time,F_Scale,Location,County,State,Lat,Lon,Comments
Time,Speed,Location,County,State,Lat,Lon,Comments
1530,UNK,ASHLAND,AROOSTOOK,ME,46.63,-68.4,LARGE TREE LIMBS DOWN AT ASHLAND COMMUNITY LIBRARY. REPORTED VIA SOCIAL MEDIA. (CAR)
1555,UNK,WASHBURN,AROOSTOOK,ME,46.79,-68.16,LARGE TREE DOWN IN WASHBURN VIA SOCIAL MEDIA. TIME ESTIMATED BASED ON RADAR. (CAR)
1600,70,4 ENE WASHBURN,AROOSTOOK,ME,46.8,-68.07,SMALL BIRCH TREE DOWN ALONG CARIBOU LAKE RD. (CAR)
1610,UNK,3 ENE WOODLAND,AROOSTOOK,ME,46.9,-68.08,TREE DOWN AND BLOCKING RT. 161. TIME ESTIMATED BASED ON RADAR. (CAR)
Time,Size,Location,County,State,Lat,Lon,Comments
1726,100,WESTFIELD,HAMPDEN,MA,42.14,-72.76,AMATEUR RADIO CONFIRMED BY BROADCAST MEDIA (BOX)

我已经接收了这个文件,并用逗号分割了它——但是我正在尝试找到一种方法让python打印出每一行,从它找到'Speed'作为第一个索引开始,到找到'Size'作为第一个索引停止。结果是:

Time,Speed,Location,County,State,Lat,Lon,Comments
1530,UNK,ASHLAND,AROOSTOOK,ME,46.63,-68.4,LARGE TREE LIMBS DOWN AT ASHLAND COMMUNITY LIBRARY. REPORTED VIA SOCIAL MEDIA. (CAR)
1555,UNK,WASHBURN,AROOSTOOK,ME,46.79,-68.16,LARGE TREE DOWN IN WASHBURN VIA SOCIAL MEDIA. TIME ESTIMATED BASED ON RADAR. (CAR)
1600,70,4 ENE WASHBURN,AROOSTOOK,ME,46.8,-68.07,SMALL BIRCH TREE DOWN ALONG CARIBOU LAKE RD. (CAR)
1610,UNK,3 ENE WOODLAND,AROOSTOOK,ME,46.9,-68.08,TREE DOWN AND BLOCKING RT. 161. TIME ESTIMATED BASED ON RADAR. (CAR)

我尝试过各种糟糕的循环,尝试过在第一个索引为“Speed”时标记的方法,但都不起作用。我不会让你厌烦我失败的尝试,而不是让自己难堪。你知道吗

作为一个python新手,我确信必须有一个合适的pythonic方法来做到这一点……甚至可能通过构建一个“for循环”来播放第一个索引的值?但我的业余Python身份显然阻碍了我。你知道吗


Tags: treetimelocationcarmediacommentsdownme
3条回答

我的Python版本是python3.7。你知道吗

def loop_file(file):
    print_line = False
    with open(file, encoding='utf-8') as f:
        for line in f:
            split = line.split(',')
            if len(split) > 1:
                item_index_one = split[1]
                if item_index_one == 'Speed':
                    print_line = True
                elif item_index_one == 'Size':
                    break
            if print_line:
                print(line)

if __name__ == '__main__':
    loop_file('your file path')

您编写的代码已经解析了文件并在逗号处拆分,因此我假设您在一个名为data的变量中有内容,该变量是一个列表列表。你知道吗

while data[0][1] != "Speed":
    data.pop(0)
while data[0][1] != "Size":
    print (",".join(data.pop(0)))

注意上面的代码没有错误检查。您可能需要确保实际上一系列速度/大小行,并且每行至少有两个字段。你知道吗

您必须创建一个布尔标志来告诉您何时打印。然而,当你达到“大小”时,你就可以跳出这个循环。你知道吗

with open(myfile) as f:
  reached_speed = False

  for line in f:
    second_item = line.split(',')[1]

    # stop printing if Size
    if reached_speed and second_item == 'Size':
      break

    # start printing if Speed
    elif not reached_speed and second_item == 'Speed':
      reached_speed = True


    if reached_speed:
      print(line)

相关问题 更多 >