2016-04-01 22 views
0

3 sütun içeren sekmeyle ayrılmış bir dosyam var.Python: Aynı değere sahip bir sütun ekleme

1 a 3 6 
1 b 3 5 
1 c 3 5 
1 d 8 4 

Bu ne: Ben sadece aynı sayıda yeni ilk sütunu eklemek istiyorum 1.

girişdosyası Bu benim outputfile için istiyorum ne

a 3 6 
b 3 5 
c 3 5 
d 8 4 

olduğunu Bugüne kadar var:

#!/usr/bin/env python 
import sys 
import csv 
f=open('inputfile.txt', 'r+') 
t=[] 
for line in f.readlines(): 
    t.append('\n') 
    t.append(1) 
    f.writelines(t) 

Ancak, ben bir hata alıyorum: traceback (en son) Son çağrı: Dosya sys.stdout ('inputfile.txt' in "./py.py", hat 6,) 'w' TypeError: 'dosya' nesne çağrılabilir değil

+5

'sys.stdout' çıkış akışı için kullanılır: çıktı verir çýktý.txt

#!/usr/bin/env python output_file = open('output.txt', 'w') input_file = open('input.txt', 'r+') for line in input_file.readlines(): line = line.split(" ") line.insert(1, str(1)) line = (" ").join(line) output_file.write(line) input_file.close() output_file.clsoe() 

kedi. Bu bir işlev değil. – Kasramvd

+1

Çıktı dosyanızı, girişinizi açtığınız gibi açmak isteyebilirsiniz. fout = open ('outputfile.txt', 'w') 've' fin = open ('inputfile.txt', 'r +') 'Ayrıca, neden giriş dosyanızı okumaya ve yazmaya çalışıyorsunuz? – Aaron

+0

Açık dosyaları temsil etmek için yorumlayıcı tarafından kullanılan pythondaki nesneleri eşleyin. Ve 'sys.stdout' nesnesi, tercümanın standart çıktısına karşılık gelen dosya nesneleri başlatıldı. 'Open()' işlevi tarafından döndürülenler gibi normal bir metin dosyası. Daha fazla bilgi için https://docs.python.org/3.4/library/sys.html#sys.stdout – Kasramvd

cevap

2

Basitçe hem dosyaları açmak ve buna yazma, çalışan bir listedeki her satıra bir 1 ve sekme \t birleştirerek . Yeni dosyada Sonra çıkış listesi:

f1 = "Input.txt" 
f2 = "Output.txt" 

t = [] 
with open(f1, 'r') as txt1: 
    for rline in txt1:  
     t.append("1\t" + rline) 

with open(f2, 'w') as txt2: 
    for i in t: 
     txt2.write(i) 

#1 a 3 6 
#1 b 3 5 
#1 c 3 5 
#1 d 8 4 
bir liste kullanımını önlemek için Alternatif

, (ama gerektirir 'a' ile dosyaya ekleme): yükünden kaçınmak

with open(f1, 'r') as txt1: 
    for rline in txt1:  
     rline = "1\t" + rline 

     with open(f2, 'a') as txt2: 
      txt2.write(rline) 

Ve daha da @JonClements önerdiği açma/her satırı ile dosya kapatılıyor:

with open(f1) as txt1, open(f2, 'w') as txt2: 
     txt2.writelines('1\t' + line for line in txt1) 
+0

Daha sonraki örneğinizi şu şekilde değiştirebilirsiniz: 'açık (f1) ile txt1, açık (f2, 'w') txt2' gibi tüm ifade bloğunuzu txt2.writelines (txt1 satırında '1 \ t' + satırı) 'yapın - bu, girişin her satırındaki dosyanın açılmasını/kapatılmasını engeller ... –

+0

@ JonClements Aferin! Bunu kredinize ekledi. – Parfait

+0

Dikkat edilmesi gereken - bu bir liste-değil - bir jeneratör ifadesidir :) –

0

Bunu yaparsanız başka bir şey istemek sen csv modülü atlamak ve sadece bu gibi bir dosyadaki her satırı başa ekleyebilir değil:

open('out.txt', 'w').writelines(["1\t" + line for line in open("in.txt")]) 
0

Bu tam olarak ne istediğiniz çıkış gösterileri verecek:

fin = open('inputfile.txt', 'r+') 
fout = open('outputfile.txt', 'w') 
t=[] 

for line in fin.readlines(): 
    t.append('1 ' + line) 

fout.writelines(t) 
+1

OP durumları * Sekme ile sınırlanmış bir dosyam var * (böylece '' 1 '+ satır' 'ilk sütuna bir değer atayacak - yeni bir tane oluşturmayan) - ayrıca - readlines önce tüm dosyayı bir listeye okuyacak, daha sonra başka bir tamamen yeni listeye eklersiniz - sadece 'fin' üzerinden döngü yapabilir ve hat-by-line yazabilirsiniz. –

1

Sen çözüm için sys modülü gerekmez:

a 1 3 6 
b 1 3 5 
c 1 3 5 
d 1 8 4 
İlgili konular