2015-06-01 2 views
1

Я пытаюсь разобрать два файла, разделенных запятыми и запятыми, и если конкретное поле соответствует файлу, создайте новую запись в 3-м файле.файл разбора в python

код следующим образом:

#! /usr/bin/python 

fo = open("c-1.txt" , "r") 
for line in fo: 
    #print line 
    fields = line.split('|') 
    src = fields[0] 

    f1 = open("Airport.txt", 'r') 
    f2 = open("b.txt", "a") 
    #with open('c.csv', 'r') as f1: 
    # line1 = f1.read() 
    for line1 in f1: 
     reader = line1.split(',') 
     hi = False 
     target = reader[0] 
     if target == src and fields[1] == 'ZHT': 
      print target 
      hi = True 
      f2.write(fields[0]) 
      f2.write("|") 
      f2.write(fields[1]) 
      f2.write("|") 
      f2.write(fields[2]) 
      f2.write("|") 
      f2.write(fields[3]) 
      f2.write("|") 
      f2.write(fields[4]) 
      f2.write("|") 
      f2.write(fields[5]) 
      f2.write("|") 
      f2.write(reader[2]) 
    if hi == False: 
     f2.write(line) 
    f2.close() 
    f1.close() 
fo.close() 

Поле соответствия печатается 2 раза в новом файле. Что может быть причиной?

+0

Можете ли вы показать свой вход и выход желания? – Kasramvd

+0

Btw лучше использовать 'with open (" c-1.txt "," r ") как fo:', тогда вам не нужно явно закрывать. –

+0

Убедитесь, что вы пометили ответ как правильный, чтобы люди, смотрящие на это в будущем, знали, что помогло! – Scironic

ответ

2

Проблема заключается в том, что вы перезагрузили hi до False на каждой итерации цикла. Допустим, что вторая линия соответствует, а третья - нет. Вы установили hi в True во вторую строчку, но затем в False снова в третьем, а затем распечатайте оригинал line.

Попробуйте так:

hi = False 
for line1 in f1: 
    reader = line1.split(',') 
    target = reader[0] 
    if target == src and fields[1] == 'ZHT': 
     hi = True 
     f2.write(stuff) 
if hi == False: 
    f2.write(line) 

Или, если предположить, что только одна строка никогда не совпадут, вы могли бы использовать for/else:

for line1 in f1: 
    reader = line1.split(',') 
    target = reader[0] 
    if target == src and fields[1] == 'ZHT': 
     f2.write(stuff) 
     break 
else: 
    f2.write(line) 

Также обратите внимание, что вы могли бы, вероятно, заменить эту серию f2.write заявлений этим соединением, соединяющим несколько частей с |:

f2.write('|'.join(fields[0:6] + [reader[2]]) 
2

Как уже упоминалось, вы сбросите флаг внутри цикла, чтобы печатать несколько строк.

Если есть определенная только одна строка, которая будет соответствовать ей, возможно, стоит сломать цикл после того, как эта строка будет найдена.

и, наконец, проверьте свои данные, чтобы убедиться, что нет одинаковых совпадающих строк.

Кроме этого у меня есть несколько других предложений, чтобы очистить ваш код и сделать его более легким для отладки:

1) Используйте csv библиотеку.

2) Если файлы могут храниться в памяти, было бы лучше держать их в памяти вместо постоянного открытия и закрытия.

3) Используйте with для обработки файлов (я уже не пробовал в ваших комментариях).

Что-то вроде следующего должно работать.

#! /usr/bin/python 

import csv 

data_0 = {} 

data_1 = {} 

with open("c-1.txt" , "r") as fo, open("Airport.txt", "r") as f1: 

    fo_reader = csv.reader(fo, delimiter="|") 

    f1_reader = csv.reader(f1) # default delimiter is ',' 

    for line in fo_reader: 

     if line[1] == 'ZHT': 
      try: # Add to a list here in case keys are duplicated. 
       data_0[line[0]].append(line) 
      except KeyError: 
       data_0[line[0]] = [line] 

    for line in f1_reader: 
     data_1[line[0]] = line[2] # We only need the third column of this row to append to the data. 

with open("b.txt", "a") as f2: 

    writer = csv.writer(f2, delimiter="|") # I would be tempted to not make this a pipe, but probably too late already if you've got a pre-made file. 

    for key in data_0: 
     if key in data_1.keys(): 
      for row in data_0[key]: 
       writer.writerow(row[:6]+data_1[key]) # index to the 6th column, and append the data from the other file. 
     else: 
      for row in data_0[key]: 
       writer.writerow(row) 

Этого следует избегать иметь дополнительные ряды, а также нет истинного/фальшивого флага, на который можно положиться.

Смежные вопросы