2016-02-12 19 views
9

CSV dosyama, koşullara bağlı olarak belirli bir etiket eklemem gerekiyor. CSV dosyasının 10 sütunu vardır ve üçüncü, dördüncü ve beşinci sütunlar en fazla koşulları etkileyenler olup, etiketimi onuncu sütuna ekliyorum. o sonsuz döngüye son vereceği neden bilmiyorumCSV Dosya Dosyasına Zorluk Zorluklar

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() 

: Ben sonsuz döngüye sona erdi burada kodu var.

DÜZENLEME: Bir hata yaptım ve benim orijinal sonsuz döngü programı bu satırı vardı:

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

Ben 'w' için 'a' değişti ama tüm bu CSV dosyanın kendisi silme sona erdi. Yani şimdi farklı bir sorunum var.

+1

'satır [2] == '0' veya satır [3] == '0' veya satır [4] == '0':' –

+1

Bu hangi bir dildir? –

+0

@EricJ. Bunun için üzgünüm. Bu etiketleri – Reginsmal

cevap

8

Burada if row[2] or row[3] or row[4] == '0': ve burada row[9] == 'Label', aynı değere eşit çeşitli değişkenleri kontrol etmek ve bir değer atamak için = kullanmak any kullanabileceğiniz bir sorun var, ayrıca ben with open kullanmayı öneriyoruz.

Ayrıca okumak ve csv dosyada aynı anda yazma, böylece size sonra orijinal birini kaldırmak ve os.remove ve os.rename kullanarak yenisini adlandırabilirsiniz, yeni csv dosyasına değişiklikleri kaydetmek gerekir edemez:

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

etiketlerine ekledim. Teşekkürler. Bu, ek modda programda sonsuz döngüyü engelledi. Ancak etiket eklenmediğinden doğru şekilde çalışmamış gibi görünüyor. – Reginsmal

+1

başka bir sorun var, yazma ve okumak için aynı dosyayı açamıyorsunuz – tinySandy

+0

'sys.argv [1] 'i okumayı denedim dosya ile' test.csv' için yazılmaya çalıştım. Ancak 'test.csv' orijinaliyle aynı şekilde sonuçlandı. – Reginsmal

0

ben Sorun hatları

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

Sen okuma için aynı dosyayı açıyoruz ve farklı bir dosya adı kullanmayı deneyin writing.So içinde olduğunu düşünüyorum.

4

bir tempfile.NamedTemporaryFile yazma ve üç unsurdan bir tuple yaratmak olarak herhangi kullanarak şey kaydetmez yüzden sadece bir alt dize tam bir dizge değil eşleşen gibi "0" test etmek için in kullanabilirsiniz Bu nedenle, dilediğiniz kadar dilim olabilir ya da sadece üyelik için test edebilirsiniz, o zaman orijinal dosyayı sadeceile değiştirirsiniz:

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] Ayrıca geçmek için gereken tek şey bu yüzden isim ve bir dize dosya olduğunu.

+0

Size ayrıca bir cevap gönderen tek kişi olduğunuz için size lütfumu veriyorum – tinySandy

İlgili konular