Python 巨蟒:“;至于;循环打印基于列字段匹配的行

Python 巨蟒:“;至于;循环打印基于列字段匹配的行,python,regex,python-3.x,linux,csv,Python,Regex,Python 3.x,Linux,Csv,我有一个python代码,它从一个原始文件生成行列表,我想搜索特定的列字段[第四列字段中有第二个字段中的行,第五列字段中有第二个字段中有FW.O的行]和外部文件内容字段中的匹配,以及打印行 L = '''SET,FW.O,AS,num:+18700000,num:+12355, SET,IT,AS,num:+22211111,num:+12355, SET,FW.O,AS,num:+177232,num:+12355, SET,IT,AS,num:+368399793,num:+12355, '

我有一个python代码,它从一个原始文件生成行列表,我想搜索特定的列字段[第四列字段中有第二个字段中的行,第五列字段中有第二个字段中有FW.O的行]和外部文件内容字段中的匹配,以及打印行

L = '''SET,FW.O,AS,num:+18700000,num:+12355,
SET,IT,AS,num:+22211111,num:+12355,
SET,FW.O,AS,num:+177232,num:+12355,
SET,IT,AS,num:+368399793,num:+12355,
'''.split()

FWmatch = open("fwfields.txt").readlines()
ITmatch = open("itfields.txt").readlines()
for row in L:
      if row[1] == "IT":
          result = [i for i in L if any(x.replace('\n','') in i.split(',')[3] for x in ITmatch)]
      elif row[1] == "FW.O":
          result = [i for i in L if any(x.replace('\n','') in i.split(',')[4] for x in FWmatch)]
print('\n'.join(result))
如果“L”第2列字段为“IT”,则应在第5列字段中查找
ITmatch

如果“L”第二列字段为“FW.O”
FWmatch
应在第五列字段中查找

cat fwfields.txt

num:+12
num:+123
num:+222
num:+333
cat itfields.txt

num:+12
num:+123
num:+222
num:+333
将错误获取为“输出”未定义,因为我的代码不工作,并且未定义变量输出。。如果在“L”处删除.split(),则获取索引器。 所需输出:

SET,FW.O,AS,num:+18700000,num:+12355,#(第5个字段与FWmatch num:+123匹配)
SET,IT,AS,num:+22211111,num:+12355,#(与ITmatch num匹配的第四个字段:+222)
SET,FW.O,AS,num:+177232,num:+12355,#(第5个字段与FWmatch num:+123匹配)
需要考虑的要点:

  • 从每行中删除结束行
  • 无法“重用”打开,因为它会读取文件。需要把它读到一个列表中,以后可以多次使用
  • 这项工作:

    FWmatch = open("fwfields.txt").readlines()
    ITmatch = open("itfields.txt").readlines()
    result1 = [i for i in lines if any(chomp(x) in i for x in FWmatch)]
    result2 = [i for i in lines if any(chomp(x) in i for x in ITmatch)]
    print('\n'.join(result1+result2))
    
    这不会:

    FWmatch = open("fwfields.txt")
    ITmatch = open("itfields.txt")
    result1 = [i for i in lines if any(chomp(x) in i for x in FWmatch.readlines())]
    result2 = [i for i in lines if any(chomp(x) in i for x in ITmatch.readlines())]
    print('\n'.join(result1+result2))
    
    需要考虑的要点:

  • 从每行中删除结束行
  • 无法“重用”打开,因为它会读取文件。需要把它读到一个列表中,以后可以多次使用
  • 这项工作:

    FWmatch = open("fwfields.txt").readlines()
    ITmatch = open("itfields.txt").readlines()
    result1 = [i for i in lines if any(chomp(x) in i for x in FWmatch)]
    result2 = [i for i in lines if any(chomp(x) in i for x in ITmatch)]
    print('\n'.join(result1+result2))
    
    这不会:

    FWmatch = open("fwfields.txt")
    ITmatch = open("itfields.txt")
    result1 = [i for i in lines if any(chomp(x) in i for x in FWmatch.readlines())]
    result2 = [i for i in lines if any(chomp(x) in i for x in ITmatch.readlines())]
    print('\n'.join(result1+result2))
    

    您的代码失败,因为
    result
    未初始化,并且该条件从未保持,因为行[1]是行的第一个字符。您应该改用row.split(',')[1]。下面是一个有效的代码:

    L = '''SET,FW.O,AS,num:+18700000,num:+12355,
    SET,IT,AS,num:+22211111,num:+12355,
    SET,FW.O,AS,num:+177232,num:+12355,
    SET,IT,AS,num:+368399793,num:+12355,
    '''.split()
    
    def chomp(x):
        return x.replace('\n','')
    
    FWmatch = open("fwfields.txt").readlines()
    ITmatch = open("itfields.txt").readlines()
    result=[]
    for row in L:
          country = row.split(',')[1]
          if country == "IT":
              codes = ITmatch
          elif country == "FW.O":
              codes = FWmatch
          num = row.split(',')[3]
          if any(chomp(c) in num for c in codes):
              result.append( row)
    print('\n'.join(result))
    

    您的代码失败,因为
    result
    未初始化,并且该条件从未保持,因为行[1]是行的第一个字符。您应该改用row.split(',')[1]。下面是一个有效的代码:

    L = '''SET,FW.O,AS,num:+18700000,num:+12355,
    SET,IT,AS,num:+22211111,num:+12355,
    SET,FW.O,AS,num:+177232,num:+12355,
    SET,IT,AS,num:+368399793,num:+12355,
    '''.split()
    
    def chomp(x):
        return x.replace('\n','')
    
    FWmatch = open("fwfields.txt").readlines()
    ITmatch = open("itfields.txt").readlines()
    result=[]
    for row in L:
          country = row.split(',')[1]
          if country == "IT":
              codes = ITmatch
          elif country == "FW.O":
              codes = FWmatch
          num = row.split(',')[3]
          if any(chomp(c) in num for c in codes):
              result.append( row)
    print('\n'.join(result))
    

    嗨,我重新定义了我的问题,使之更清晰。。result1、result2对我来说很好,但我想使用for循环来读取每一行,并查看第二个字段是it还是FW.O,如果满足,则匹配所需ITmatch/FWmatch文件中的第4/5列。。请参阅我尝试过的FOR循环IF..ELSE条件,以及了解错误问题的帮助。您好,我已重新定义了我的问题以使其更清晰。。result1、result2对我来说很好,但我想使用for循环来读取每一行,并查看第二个字段是it还是FW.O,如果满足,则匹配所需ITmatch/FWmatch文件中的第4/5列。。请参阅我尝试过的FOR循环IF..ELSE条件,并帮助了解错误问题。