Python: цикл «FOR» для печати строк на основе совпадения полей столбцов - PullRequest
1 голос
/ 16 октября 2019

У меня есть код Python, который генерирует список строк из необработанного файла, и я хочу найти определенное поле столбца [поле 4-го столбца с для строк, имеющих IT во втором поле, поле 5-го столбца для строк, имеющих 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", ITmatch должно искать в поле 5-го столбца.

если в поле «L» 2-го столбца указано «FW.O» FWmatch, следует искать в поле 5-го столбца.

cat fwfields.txt

num:+12
num:+123

cat itfields.txt

num:+222
num:+333

Получение ошибки как «output» не определено, так как мой код не работает, а переменная output не определена. Получение IndexError, если я удаляю .split () в «L». Требуемый выход:

SET,FW.O,AS,num:+18700000,num:+12355,#(5th field matched with FWmatch num:+123)
SET,IT,AS,num:+22211111,num:+12355,#(4th field matched with ITmatch num:+222)
SET,FW.O,AS,num:+177232,num:+12355,#(5th field matched with FWmatch num:+123)

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Ваш код завершается ошибкой, потому что 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))
0 голосов
/ 16 октября 2019
$ cat fwfields.txt
num:+17
num:+18`

$ cat itfields.txt
num:+222
num:+333

lines="""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','')

очков для рассмотрения:

  1. удалить конечную строку из каждой строки
  2. вы не можете «повторно использовать» open, так как он читает файл. Нужно прочитать его в список, который вы можете использовать позже несколько раз.

Это работает:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...