2017-11-15 27 views
-2

テキストファイルを読み込んでその内容を別のファイルにコピーするプログラムを作成する必要があります。私はテキストファイルの最後に列を追加し、関数calc_billを使って計算されたintをその列に代入する必要があります。元のファイルの内容を新しいファイルにコピーすることができますが、calc_billを実行するのに必要なintでプログラムを読み込むことができません。 ご協力いただければ幸いです。それは新しいファイルにになっているとおりに、ファイルをコピーしているPythonファイルの読み込みと書き込み

CustomerID Title FirstName MiddleName LastName Customer Type 
1 Mr. Orlando N. Gee Residential  297780 302555 
2 Mr. Keith NULL Harris Residential  274964 278126 

:ここ

は、私はから読んでいるテキストファイルの最初の3行があります。機能していないのは、bill_amount(calc_bill)/ billVal(main)を新しい列の新しいファイルに書き込むことです。ここでは、新しいファイルに予想される出力されます。

CustomerID Title FirstName MiddleName LastName Customer Type Company Name Start Reading End Reading BillVal 
1 Mr. Orlando N. Gee Residential  297780 302555  some number 
2 Mr. Keith NULL Harris Residential  274964 278126 some number 

そしてここでは、私のコードは次のとおりです。

def main(): 
    file_in = open("water_supplies.txt", "r") 
    file_in.readline() 
    file_out = input("Please enter a file name for the output:") 
    output_file = open(file_out, 'w') 
    lines = file_in.readlines() 
    for line in lines: 
     lines = [line.split('\t')] 
     #output_file.write(str(lines)+ "\n") 
     billVal = 0 
     c_type = line[5] 
     start = int(line[7]) 
     end = int(line[8]) 
     billVal = calc_bill(c_type, start, end) 
     output_file.write(str(lines)+ "\t" + str(billVal) + "\n") 


def calc_bill(customer_type, start_reading, end_reading): 
    price_per_gallon = 0 

    if customer_type == "Residential": 
     price_per_gallon = .012 

    elif customer_type == "Commercial": 
     price_per_gallon = .011 

    elif customer_type == "Industrial": 
     price_per_gallon = .01 

    if start_reading >= end_reading: 
     print("Error: please try again") 

    else: 
     reading = end_reading - start_reading 

    bill_amount = reading * price_per_gallon 
    return bill_amount 
main() 
+0

電流出力は何ですか? – Shadow

+0

コンパイル時にエラーはありません。新しく生成されたテキストファイルへの現在の出力は、元の質問の「コード」の2番目のブロックにあります。 –

+0

あなたはそれが期待される出力であると書いています。あなたはそれを修正することがあります:) – Shadow

答えて

0

は、上記の問題がありますが、ここでは正常に動作するあなたのmain()方法に小さな変化があります。

def main(): 
    file_in = open("water_supplies.txt", "r") 
    # skip the headers in the input file, and save for output 
    headers = file_in.readline() 
    # changed to raw_input to not require quotes 
    file_out = raw_input("Please enter a file name for the output: ") 
    output_file = open(file_out, 'w') 
    # write the headers back into output file 
    output_file.write(headers) 
    lines = file_in.readlines() 
    for line in lines: 
     # renamed variable here to split 
     split = line.split('\t') 
     bill_val = 0 
     c_type = split[5] 
     start = int(split[6]) 
     end = int(split[7]) 
     bill_val = calc_bill(c_type, start, end) 
     # line is already a string, don't need to cast it 
     # added rstrip() to remove trailing newline 
     output_file.write(line.rstrip() + "\t" + str(bill_val) + "\n") 

あなたのループ内line変数は、改行が含まれているので、あなたがそのまま出力ファイルに書き込むつもりなら、同様のことを取り除く必要があることに注意してください。あなたのstartendのインデックスも1だけずれていたので、split[6]split[7]に変更しました。

ユーザーにファイル名の引用符を含めないようにすることをお勧めします。そのようにも留意してください。簡単な方法は、inputの代わりにraw_inputを使用することです。 (OPから)

サンプル入力ファイル:

CustomerID  Title FirstName  MiddleName  LastName  Customer Type 
1  Mr.  Orlando N.  Gee  Residential  297780 302555 
2  Mr.  Keith NULL Harris Residential  274964 278126 

$ python test.py 
Please enter a file name for the output:test.out 

出力(test.outに):

1  Mr.  Orlando N.  Gee  Residential  297780 302555 57.3 
2  Mr.  Keith NULL Harris Residential  274964 278126 37.944 
+0

ご協力いただきありがとうございますが、私はまだ新しく生成されたファイルで同じ出力を得ているようです。 –

+0

私の編集を参照してください。上記のコードを実行したときに生成された出力と、元の質問から使用している入力ファイルを追加しました。 –

+0

ありがとう、これは動作します。私の唯一の質問は、input()関数がユーザに引用符を使用させてもらうことはどういう意味ですか? –

0

カップルのものがあります。カラム名に一貫性のないスペースがあると、実際のカラムを少し混乱させることになりますが、そこには9つのカラム名があると思います。ただし、データの各行には8つの要素しかないため、余分な列名(「CompanyName」など)があるようです。だからそれを取り除くか、データを修正してください。

"start"変数と "e​​nd"変数がそれぞれインデックス7と8を指しています。しかし、行には8つの要素しかないので、インデックスは6と7でなければなりません。

もう1つの問題は、for-loopの "lines"の中で、その行for-loopの中の2番目の "lines"変数を "elements"のようなものに改名することをお勧めします。

それ以外でも、名前の一貫性については注意が必要です。列名の中には、ラクダの大文字と小文字のものがあります。あなたの変数のいくつかはアンダースコアで区切られ、その他はラクダのケースです。

うまくいけば助けてください。他に質問がある場合はお知らせください。

0

あなたの変数を扱う上で、両方とも同じ行に2個のエラーがあります:あなたは、ファイル全体の内容は、あなたのlines変数、にこれを入れ

lines = [line.split()] 
  • を。残りの入力データを失っただけです。
  • あなたはsplitの返品から新しいリストのリストを作成しました。

は、この行を試してみてください:私は、タブのプレースメントについての仮定のカップルを作るたら

line = line.split() 

私は、その変化に合理的な出力を得ました。

また、ではなく、が異なるデータセマンティックで変数を上書きするとします。それは使用法を混乱させる。例えば:

for record in lines: 
    line = record.split() 
関連する問題