2013-09-18 2 views
2

Я следующие два типа текстовых файлов:Пишущие пустые столбцы в питоне

File1

Sample1012, Male, 36, Stinky, Bad Hair 
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me 
Sample23905, Female, 42, Cougar, Long Hair, Chub 
Sample123, Male, 32, Party Guy 

File2

DEAD, Sample123, Car Accident, Drunk, Dumb 
ALIVE, Sample1012, Alone 
ALIVE, Sample23905, STD 
DEAD, Sample1043, Too Hot, Exploded 

Я просто хочу, чтобы написать просто Python скрипт, чтобы присоединиться к этим файлы, основанные на поле выборки, но все время сталкиваются с проблемой случайного числа столбцов данных. Например, я в конечном итоге с:

Sample1012, Male, 36, Stinky, Bad Hair, ALIVE, Sample1012, Alone 
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me, DEAD, Sample1043, Too Hot, Exploded 
Sample23905, Female, 42, Cougar, Long Hair, Chub, ALIVE, Sample23905, STD 
Sample123, Male, 32, Party Guy, DEAD, Sample123, Car Accident, Drunk, Dumb 

Когда я хочу это:

Sample1012, Male, 36, Stinky, Bad Hair, EMPTY COLUMN, EMPTY COLUMN, ALIVE, Sample1012, Alone 
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me, DEAD, Sample1043, Too Hot, Exploded 
Sample23905, Female, 42, Cougar, Long Hair, Chub, EMPTY COLUMN, ALIVE, Sample23905, STD 
Sample123, Male, 32, Party Guy, EMPTY COLUMN, EMPTY COLUMN, EMPTY COLUMN, DEAD, Sample123, Car Accident, Drunk, Dumb 

Я в основном только чтение в обоих файлах с .readlines(), а затем сравнивая соответствующую колонку с Идентификатор образца с простым «==», и если это правда, оно выводит строку из первого файла и второго.

Не знаете, как использовать len(), чтобы определить максимальное количество столбцов в файле1, чтобы я мог учитывать это в конце каждой строки, если это не максимальное количество столбцов, прежде чем добавить строку из другой file (при условии, что значение «==» истинно).

Любая помощь очень ценится.

UPDATE:

Это то, что я получил в настоящее время:

import sys 
import csv 

usage = "usage: python Integrator.py <table_file> <project_file> <outfile>" 
if len(sys.argv) != 4: 
    print usage 
    sys.exit(0) 

project = open(sys.argv[1], "rb") 
table = open(sys.argv[2], "rb").readlines() 
outfile = open(sys.argv[3], "w") 

table[0] = "Total Table Output \n" 

newtablefile = open(sys.argv[2], "w") 
for line in table: 
    newtablefile.write(line) 

projectfile = csv.reader(project, delimiter="\t") 
newtablefile = csv.reader(table, delimiter="\t") 

result = [] 

for p in projectfile: 
    print p 
    for t in newtablefile: 
     #print t 
     if p[1].strip() == t[0].strip(): 
      del t[0] 
      load = p + t 
      result.append(load) 


for line in result: 
    outfile.write(line) 

outfile.close() 

Не удается получить для петель, чтобы работать вместе - не возражали немой вещи на остановке. один из файлов имеет пустую первую строку.

+0

Оцените быструю помощь - ПУСТОЙ КОЛОНКА на самом деле должно быть пустым полем. Я хочу сохранить их в финальном выпуске. Ответ от Павла приближает меня, но не совсем там. – user1265669

ответ

1

Не знаете, где «пустые столбцы» входят в ваш предлагаемый вывод ... если столбцы должны совпадать с определенным шаблоном, тогда вы должны иметь пустые места во входных файлах. В противном случае, это будет работать ...

import csv 


f1 = open("test1.txt", 'rb') 
reader1 = csv.reader(f1) 
f2 = open("test2.txt", 'rb') 
reader2 = csv.reader(f2) 
result = [] 

for entry in reader1: 
    print entry 
    for row in reader2: 
     print row 
     if entry[0].strip() == row[1].strip(): 
      del row[1] 
      load = entry + row 
      result.append(load) 

for line in result: 
    print line 

EDIT -

Если необходимо пропустить строку в одном из файлов, которые вы можете просто сделать reader1.next() , который перемещает указатель на следующая строка ввода.

В вашем примере вы создаете выходной файл, вы записываете на него данные, а затем пытаетесь прочитать его, не закрывая файл и не открывая его, или открывая его как читаемый и не записываемый ... Я не мог к нему поклясться , но я думаю, что это, скорее всего, ваша проблема. К счастью, вам не нужно все это делать с помощью метода .next().

+0

У меня есть это: Кажется, не получается получить первый цикл для работы на самом деле. Кажется, он работает один раз, затем другой цикл цикла полностью, а затем первый цикл цикла, не привлекая второй .... так поздно ... не могу понять, как опубликовать мой код в комментарии ... – user1265669

0

Хм, вам, вероятно, следует использовать rdbms для эффективности, но вы можете использовать словари, чтобы сделать это лучше.

Когда вы используете readline() на первом, просто разделите все до первой запятой и используйте это как ключ, а значение - список.

так что-то вроде

{'Sample1012': ['Sample1012', 'Male', 36, 'Stinky', 'Bad Hair']} 

теперь, что вы можете сделать то же самое с другим файлом

и просто,

for key in dict1.keys: 
    dict1[key] += dict2.get(key, []) 

, и это будет иметь все соответствующие вещи прилагается к первому словарю ..

Это только делает жизнь проще для вас

0
with open('file1') as f1, open('file2') as f2: 
    dic = {} 
    #Store the data from file2 in a dictionary, with second column as key 
    for line in f2: 
     data = line.strip().split(', ') 
     key = data[1] 
     dic[key] = data 
    #now iterate over each line in file1 
    for line in f1: 
     data = line.strip().split(', ') 
     #number of empty columns = `(7-len(data))` 
     data = data + ['EMPTY COLUMN']*(7-len(data)) 
     print '{}, {}'.format(", ".join(data), ', '.join(dic[data[0]])) 

выход:

Sample1012, Male, 36, Stinky, Bad Hair, EMPTY COLUMN, EMPTY COLUMN, ALIVE, Sample1012, Alone 
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me, DEAD, Sample1043, Too Hot, Exploded 
Sample23905, Female, 42, Cougar, Long Hair, Chub, EMPTY COLUMN, ALIVE, Sample23905, STD 
Sample123, Male, 32, Party Guy, EMPTY COLUMN, EMPTY COLUMN, EMPTY COLUMN, DEAD, Sample123, Car Accident, 
0

Вы можете получить весь файл в список списков, а затем найти максимальное количество полей с помощью:

file1 = open("file1.txt") 
list1 = [s.split(",") for s in file1] 
file1.close() 
maxlen1 = max([len(x) for x in list1]) 

Словарь - лучшая структура для l ookups на втором файле

file2 = open("file2.txt") 
dict2 = { } 
for line2 in file2: 
    cols2 = line2.split(",") 
    dict2[cols2[1]] = cols2 
file2.close() 

Теперь, если cols1 является любой список столбцов из list1, то вы можете использовать:

cols3 = cols1 + (maxlen1 - len(cols1))*[" EMPTY COLUMN"] + dict2[cols1[0]] 

... создать список дополняется «EMPTY КОЛОННЫХ» значений по мере необходимости. Теперь вы можете конвертировать, что обратно в одну строку с:

",".join(cols3) 

Я не пытался обрезать строки, так что вы будете в конечном итоге с теми же пробелами после запятой, как и прежде. Есть небольшая проблема, что без пробелов до «DEAD», «ALIVE» и т. Д. Вы можете внести это изменение при создании dict2 или при извлечении для формирования cols3.

Ошибка обработки ошибок ввода-вывода файлов. Фрагменты - это фрагменты.

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