2016-10-07 2 views
0

У меня есть файл, как этотДобавить значение в колонку и распечатать результаты

Daniel 400 411 f 
Mark 976 315 g 

Я хотел бы добавить 20 к строке [2] и вычесть 20 из строки [1] и печатать новые результаты перезапись этого строки или новый файл. Это моя попытка.

f=open('w', 'r') 
r = open('w2','a') 
lines=f.readlines() 
for line in lines: 
    new_list = line.rstrip('\r\n').split('\t') 
    q_start=int(new_list[1]) - 20 
    q_end=int(new_list[2]) + 20 
    # I think something is missing here, but I don't know what 
    r.writelines(lines) 
f.close() 
r.close() 

Ожидаемые результаты

Daniel 380 431 f 
Mark 956 335 g 

ответ

4
f=open('w', 'r') 
r=open('w2','a') 
lines=f.readlines() 

for line in lines: 
    new_list = line.rstrip('\r\n').split('\t') 
    new_list[1] = str(int(new_list[1]) - 20) 
    new_list[2] = str(int(new_list[2]) + 20) 
    r.write("\t".join(new_list)+"\n") 

f.close() 
r.close() 

Это должно работает. В принципе, вам нужно сначала разделить свою линию на сегменты, а затем изменить нужные части и сшить их вместе.

+0

Я пробовал что-то подобное, используя это, используя соединение, но не работал, возможно, я допустил некоторую ошибку. В любом случае, вы работаете, спасибо! – user3224522

+1

И вы также можете попробовать синтаксис 'with' в ответе Ами Тавори. Это более удобно и безопасно, если вы забудете закрыть файлы. – Ivan

3

Нет необходимости читать во всех строках в памяти, а затем перебирать их. Он просто удлиняет код и менее эффективен. Вместо этого попробуйте

with open('w2','w') as out: 
    for line in open('w', 'r'): 
     new_list = line.rstrip('\r\n').split('\t') 
     q_start=int(new_list[1]) - 20 
     q_end=int(new_list[2]) + 20 
     out.write('\t'.join([line[0], str(q_start), str(q_end), line[3]]) + '\n') 

Обратите внимание на использование with to open 'w2' и more efficient loop over the 'w''s lines.


Редактировать адресация Комментарий

Обратите внимание, что если у вас есть несколько столбцов (но все-таки нужно обновить только те, в столбцах с 1 и 2), вы можете изменить последнюю строку

 out.write('\t'.join([line[0], str(q_start), str(q_end)] + line[3: ]) + '\n') 
+0

это хорошо, но что, если у меня есть до десяти аргументов в строке? – user3224522

+0

Вам все еще нужно менять только те, что указаны в 1 и 2? –

+0

Да, я меняю только на 1 и 2, но у меня больше 10 столбцов в строке, и я не хочу писать все, потому что я тоже думал об этом, но я был уверен, что был более эффективный и приятный способ. . – user3224522

1

Я вижу, что вы уже приняли ответ, но все же, вот мой комментарий. В вашем коде есть несколько ошибок. Во-первых, даже если вы правильно вычисляете значения, вы храните их в две переменные (q_start и q_end), которые впоследствии не используются.

Вторая ошибка заключается в том, что вы записываете в выходной файл неизменные исходные данные (список lines) и делаете это внутри цикла (проверьте свои идентификаторы). следовательно, я считаю, что ваш результат был повторением N исходного файла, где N - количество строк в нем.

Возможна ошибка thirs с использованием 'a', чтобы открыть выходной файл. Если в нем есть какой-либо контент, он не будет удален. Поскольку я не уверен в ваших намерениях, это может быть ошибкой, но обратите внимание, если вы хотите получить чистый список или нет.

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

f=open('w.txt', 'r') 
r = open('w2.txt','a') 
lines=f.readlines() 
for line in lines: 
    print line 
    new_list = line.rstrip('\r\n').split(' ') 
    new_list[1]=str(int(new_list[1]) - 20) 
    new_list[2]=str(int(new_list[2]) + 20) 
    r.write('\t'.join(new_list)+"\n") 
f.close() 
r.close() 

Надеюсь, это поможет.

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