2016-02-12 3 views
9

Я должен добавить конкретную метку в файл CSV на основе условий. Файл CSV имеет 10 столбцов, а третий, четвертый и пятый столбцы - те, которые больше всего влияют на условия, и я добавляю свою метку в десятый столбец. У меня есть код, который заканчивается бесконечным циклом:CSV Запись в файл Сложности

import csv 
import sys 

w = open(sys.argv[1], 'w') 
r = open(sys.argv[1], 'r') 

reader = csv.reader(r) 
writer = csv.writer(w) 

for row in reader: 
    if row[2] or row[3] or row[4] == '0': 
     row[9] == 'Label' 
     writer.writerow(row) 

w.close() 
r.close() 

Я не знаю, почему это закончится бесконечным циклом.

EDIT: Я сделал ошибку, и моя оригинальная программа бесконечный цикл имел следующую строку:

w = open(sys.argv[1], 'a') 

Я изменил 'a' к 'w', но это в конечном итоге стереть весь CSV сам файл. Так что теперь у меня другая проблема.

+1

'if row [2] == '0' или row [3] == '0' или row [4] == '0':' –

+1

На каком языке это? –

+0

@EricJ. Извини за это. Я добавил его в теги – Reginsmal

ответ

8

У вас есть проблема здесь if row[2] or row[3] or row[4] == '0': и здесь row[9] == 'Label', вы можете использовать any для проверки нескольких переменных, равные тому же значению, и использовать = присвоить значение, также я бы рекомендовал использовать with open.

Кроме того, вы не можете читать и писать в то же время в csv файле, так что вам нужно, чтобы сохранить изменения в новый файл CSV, вы можете удалить оригинал после и переименовать новый, используя os.remove и os.rename:

import csv 
import sys  
import os 

with open('some_new_file.csv', 'w') as w, open(sys.argv[1], 'r') as r: 
    reader, writer = csv.reader(r), csv.writer(w) 
    for row in reader: 
     if any(x == '0' for x in (row[2], row[3], row[4])): 
      row[9] = 'Label' 
     writer.writerow(row) 

os.remove('{}'.format(sys.argv[1])) 
os.rename('some_new_file.csv', '{}'.format(sys.argv[1])) 
+0

Спасибо, что это предотвратило бесконечный цикл в программе в режиме добавления. Однако, похоже, он не работал правильно, поскольку метка не была добавлена. – Reginsmal

+1

есть еще одна проблема, вы не можете открыть тот же файл для записи и чтения – tinySandy

+0

Я попытался изменить 'sys.argv [1]', чтобы быть записанным в 'test.csv', с файлом, который мне нужно прочитать. Однако 'test.csv' оказался таким же, как и оригинал. – Reginsmal

0

Я думаю, что проблема в линии

w = open(sys.argv[1], 'w') 
r = open(sys.argv[1], 'r') 

Вы открываете тот же файл для чтения и writing.So попробуйте использовать другое имя файла.

4

вы можете написать в tempfile.NamedTemporaryFile и просто использовать in для проверки "0", как вы сопрягать полную строку не подстроку, так что вы ничего не сэкономить, используя любой, как создать кортеж из трех элементов поэтому вы можете также нарезать или просто протестировать членство вне зависимости от того, вы просто замените исходный файл на shutil.move:

import csv 
import sys  
from shutil import move 
from tempfile import NamedTemporaryFile 

with NamedTemporaryFile("w", dir=".", delete=False) as w, open(sys.argv[1]) as r: 
    reader, writer = csv.reader(r), csv.writer(w) 
    writer.writerows(row[:-1] + ['Label'] if "0" in row[2:5] else row 
        for row in reader) 

move(w.name, sys.argv[1]) 

sys.argv[1] также вы имя файла и строку, так что все, что вам нужно пройти.

+0

Я даю вам свою щедрость, так как вы единственный, кто отправил хороший ответ, кроме меня – tinySandy

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