2016-04-01 12 views
0

3つの列を含むタブ区切りファイルがあります。Python:同じ値の列を追加する

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

これは何です:私は1

inputfileには、これは私が私のOUTPUTFILEのために持っていたいものです

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

あるだけで同じ番号の新しい最初の列を追加したいと思います私がこれまで持っている:

#!/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) 

はしかし、私はエラーを取得しています: トレースバックは、(最近の)最後の呼び出し: sys.stdoutの( 'inputfile.txt' で ファイル "./py.py"、6行目、 'W') 例外TypeError:その場合は 'ファイル' オブジェクトは、

+5

'sys.stdout'は、出力ストリームのために使用されています。それは機能ではありません。 – Kasramvd

+1

入力ファイルを開いたのと同じ方法で出力ファイルを開くことができます。 'fout = open( 'outputfile.txt'、 'w')'と 'fin = open( 'inputfile.txt'、 'r +')'また、入力ファイルを読み書きしようとしています。 – Aaron

+0

オープンファイルを表すためにインタープリタによって使用されるPythonのファイルオブジェクト。また、 'sys.stdout'オブジェクトはインタプリタの標準出力に対応するファイルオブジェクトに初期化されます。 'open()'関数が返すような通常のテキストファイルです。続きを読むhttps://docs.python.org/3.4/library/sys.html#sys.stdout – Kasramvd

答えて

2

は単純に両方のファイルを開いて、それへの書き込み、実行中のリスト内の各ラインに1とタブ\tを連結。次に、新しいファイルへの出力リスト:

また
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 

、リストの使用を避けるために(しかし'a'でファイルに追加が必要です):

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

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

そして、さらにオーバーヘッドを回避@JonClementsによって提案されました開口部の/各ラインでファイルを閉じる:

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

後の例を次のように変更できます: 'open(f1)をtxt1、open(f2、 'w') 'txt2'を実行すると、文全体が' txt2.writelines( '1 \ t' + txt1の行の行)ブロックになります。これにより、ファイルの各行を開閉するオーバーヘッドを避けることができます。 –

+0

@ JonClementsよくやった!あなたのクレジットにそれを加えました。 – Parfait

+0

ちょうど注意してください - これはリストコンパイルではありません - それはジェネレータ式です:) –

0

呼び出すことはできません何もしたくないあなたはcsvモジュールをスキップして、ちょうどこのように、ファイル内の各行を付加することができません。

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

これはまさに、ご希望の出力が示すあなたを与えるだろう。

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状態*タブ区切りファイル*を持っていますので( ''1' + line''は最初のカラムに値を付加します - 新しいものを作成しない) - また、readlineはファイル全体を最初にリストに読み込み、別の全く新しいリストに追加します。ちょうど 'fin'をループして行単位で書くことができます。 –

1

あなたは解決策のためのsysモジュールを必要としない:出力を与えるoutput.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() 

猫:

a 1 3 6 
b 1 3 5 
c 1 3 5 
d 1 8 4 
関連する問題