【问题标题】:Separating columns from a file by last column按最后一列从文件中分离列
【发布时间】:2016-05-15 23:03:53
【问题描述】:

我正在尝试这样做:如果最后一列是 1-5 的负数,则将第二列和最后一列写入文件“neg.txt”。如果最后一列是正数,则需要将第二列和最后一列写入“pos.txt”。我的两个输出文件在执行后都是空的。当我认为 if 语句 可以处理多个条件时,我不知道代码有什么问题。我也尝试过使用正则表达式,但它不起作用,所以我尽可能简单地查看什么不起作用。

输入文件如下所示:

abandon     odustati         -2
abandons      napusta     -2
abandoned    napusten   -2
absentee    odsutne       -1
absentees   odsutni          -1
aboard      na brodu     1
abducted     otet       -2
accepted         prihvaceno 1

我的代码是:

from urllib.request import urlopen
import re

pos=open('lek_pos.txt','w')
neg=open('lek_neg.txt','w')

allCondsAreOK1 = ( parts[2]=='1' and parts[2]=='2' and
             parts[2]=='3' and parts[2]=='4' and parts[2]=='5' )

allCondsAreOK2 = ( parts[2]=='-1' and parts[2]=='-2' and
             parts[2]=='-3' and parts[2]=='-4' and parts[2]=='-5' )

with open('leksicki_resursi.txt') as pos:
    for line in pos:
        parts=line.split()  # split line into parts
        if len(parts) > 1: # if at least 2 columns (parts)
            if allCondsAreOK:
                pos.write(parts[1]+parts[2])
            elif allCondsAreOK2:
                neg.write(parts[1]+parts[2])
        else:
            print("nothing matches")

【问题讨论】:

  • 如果parts是你的列,我认为你的条件应该使用OR而不是AND
  • 如果我在两种情况下都使用 OR 而不是 AND 则只有 'lek_neg.txt' 用于负数(如果已满,但正数仍为空)
  • 那是因为你必须在 for 里面做条件,而不是在外面(不是在它之前)
  • 是否可以将所有这些条件放在 if 语句中?因为它不是这样工作的,如果我把这个条件放在 for 循环中,它会在行上给出一个错误:pos.write(parts[1]+parts[2]) - UnsupportedOperation: not writable。谢谢

标签: regex python-3.x split


【解决方案1】:

你不需要一个正则表达式,你只需要一个 if/elif 检查在转换为 int 后最后一个值是否在 -5-1 之间,如果它写入到 neg 文件或者值是您写入 pos 文件的任何非负数:

with open('leksicki_resursi.txt') as f,  open('lek_pos.txt','w')as pos, open('lek_neg.txt','w') as neg:
    for row in map(str.split, f):
        a, b = row[1], int(row[-1])
        if b >= 0:
            pos.write("{},{}\n".format(a, b))
        elif -5 <= b <= -1:
            neg.write("{},{}\n".format(a, b))

如果正数也必须在 1-5 之间,那么您可以执行类似于负数条件的操作:

    if 5 >= int(b) >= 0:
         pos.write("{},{}\n".format(a, b))
    elif -5 <= int(b) <= -1:
         neg.write("{},{}\n".format(a, b))

如果你有空行,你可以过滤掉它们:

  for row in filter(None,map(str.split, f)):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 2012-11-23
    • 2019-03-20
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多