2016-04-06 15 views
1

Yapmak istediğim, bir dosyanın belirli bir bölümüne bir değer yazmaktır. Bu bölüm dosyada herhangi bir yerde olabilir, ancak sadece bir kez görünecektir, bu yüzden bir satırın ekleneceğini düşünmüyorum. Ben yapmak istiyorum nePython - Çizginin değil, dosyanın belirli bir bölümüne yaz - Regex

TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [] 
) 

sağ [] sonra Etiketler = iç dosyasına bir dize ekleyin: Ben ne var

esas olan bir metin dosyasıdır. Diğer bir konu, var olan etiket olabileceğini olduğunu

TitleThing (
Some info = 22 
Otherthing -- "56.foo" 
(More info = 22.2) 

Tags = ["newtag"] 
) 

: gibi

misiniz görünüyor ben çıkarken listeye benim "newtag" eklemek istiyorum Bu durumda

TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = ["oldtag, othertag"] 
) 

yüzden ilk önce görünür.

ile başlamak var:

tagRegex = re.compile(r'Tags = [(.*)]') 

Ama nasıl devam etmek emin değilim.

Yardım isterim!

Teşekkürler.

+0

Regex b'ye ihtiyacınız yok ut cevabınız için geçici bir dosyaya –

+0

yazmanız gerekecek! Açıklar mısınız? – flec8

+0

Şu nesnelere bakıyorsunuz: Tags = ... '? –

cevap

0

.

Sonra sadece yeni değer geçirir

from tempfile import NamedTemporaryFile 
from shutil import move 


def add_new(new): 
    with open("check.txt") as f, NamedTemporaryFile("w",delete=False) as tmp: 
     for line in f: 
      if line.startswith("Tags ="): 
       repl = ", {}]".format(new) if "[]" not in line else "{}]".format(new) 
       tmp.write(line.replace("]", repl)) 
       tmp.writelines(f) 
       break 
      tmp.write(line) 
    move(tmp.name, "check.txt") 
:

repl = "[{}, ".format(new) if "[]" not in line else "[{}".format(new) 
    tmp.write(line.replace("[", repl)) 

Bağlı Olarak: başında yeni değeri isteseydim

In [3]: cat check.txt 
TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [] 
) 
In [4]: add_new("newvalue") 

In [5]: cat check.txt 
TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [newvalue] 
) 
In [6]: add_new("newvalue2") 

In [7]: cat check.txt 
TitleThing (
Some info = 22 

(More info = 22.2) 
Tags = [newvalue, newvalue2] 
) 

, sadece biraz mantık değiştirmeniz gerekir yorumunuz aşağıdakileri değiştirecek:

if '"Tags": [' in line: 
+0

Bu doğru görünüyor, ancak çalıştırdığımda, dosya yazılmıyor. Yanlış yaptığımdan emin değilim. – flec8

+0

@ flec8 ,. Sağladığınız şeylere göre kesinlikle doğru. Eşleşecek ve hiç boşluk bırakmayacak doğru dizeyi kullandığınızdan emin misiniz? –

+0

ah haklısın! ne var TitleThing olan ( Bazı bilgiler 22 (Daha fazla bilgi = 22.2) "Etiketler" =: [], ) – flec8

0

Kirli fikir: f sen düzenlenmiş halini yazma yeni bir dosya olduğu

exec('Tags = ["newtag"]') 
Tags.append("othertag") 
f.write('Tags = {}'.format(Tags)) 

(veya kullanmak: Eğer listesini düzenlemek, değerlendirmek, Tags = ... satırı okuyabilir, sonra yeniden temp dosyası diğer cevapta olduğu gibi).

(Tabii her zaman keyfi bir dize yürütmek için tehlikelidir, ama bir kerelik script eğer çalışır.) Daha sonra orijinali üzerine geçici bir dosyaya yazmak gerekir