0

したがって、次のようにフォーマットされた複数のtxtドキュメントがあります。

james  
M  
18  
72   
170  
teresa  
F  
19  
63  
115  

名前が 2 つしかないものもあれば、50 のものもあります。

Name: james  
Gender: M  
Age: 18  
Height: 72  
Weight: 170  
Name: teresa  
Gender: F  
Age: 19  
Height: 63  
Weight: 115  

これまでのところ、私は持っています:

def tagInfo(fileName):
    with open(fileName) as infile, open("altered.txt","w") as outfile:
        for i,line in enumerate(infile):
            if i == 0:
                outfile.write("Name: "+line.strip()+"\n")
            if i == 1:
                outfile.write("Gender: "+line.strip()+"\n")
            if i == 2:
                outfile.write("Age: "+line.strip()+"\n")
            if i == 3:
                outfile.write("Height: "+line.strip()+"\n")
            if i == 4:
                outfile.write("Weight: "+line.strip()+"\n")
    outfile.close()

このプログラムは、最初の 5 行を編集するだけです。変更する 50 人のリストを指定すると、最初の 5 行だけでなく、50 人のすべての情報が変更されるようにしようとしています。私の現在のソリューションでは、それは不可能です。ここからどこへ行けばいいのかわからず、すべてを破棄して別のアプローチを取るのが最善かもしれないと感じています.

皆さん、解決策はありますか?

4

4 に答える 4

3

ファイルにフィールドの固定リストがある場合は、フィールドをリストとして定義し、行番号とモジュラスをインデックスとして使用してフィールド名を取得します。

fields = ('Name', 'Gender', 'Age', 'Height', 'Weight')

def tagInfo(fileName):
    with open(fileName) as infile, open("altered.txt","w") as outfile:
        for i, line in enumerate(infile):
            field = fields[i % len(fields)]
            outfile.write('{0}: {1}\n'.format(field, line))

5 つ以上ある場合は、必要に応じてフィールドを追加できます。

于 2012-12-07T16:45:39.220 に答える
1

解決

変更されたソリューション

短くてシンプルな mod を使用するだけです。

def tagInfo(fileName):
    with open(fileName) as infile, open("altered.txt","w") as outfile:
        for i,line in enumerate(infile):
            if i % 5 == 0:
                outfile.write("Name: "+line.strip()+"\n")
            elif i % 5 == 1:
                outfile.write("Gender: "+line.strip()+"\n")
            elif i % 5 == 2:
                outfile.write("Age: "+line.strip()+"\n")
            elif i % 5 == 3:
                outfile.write("Height: "+line.strip()+"\n")
            elif i % 5 == 4:
                outfile.write("Weight: "+line.strip()+"\n")
    outfile.close()


書き換えられたソリューション

このソリューションは、コードをよりクリーンにすることは言うまでもなく、コード内の多くの重複を排除するため、はるかに優れています。

fields = ("Name", "Gender", "Age", "Height", "Weight") # can be edited as per req.s
l = len(fields)

def tagInfo(fileName):
    with open(fileName) as infile, open("altered.txt","w") as outfile:
        for (index, s) in enumerate(infile):
             field = fields[index % l]
             outfile.write("{}: {}\n".format(field, s.strip())
    outfile.close()


モッド機能

ドキュメントから:

% (剰余) 演算子は、最初の引数を 2 番目の引数で割った余りを返します。数値引数は最初に共通の型に変換されます。右ゼロの引数は、ZeroDivisionError 例外を発生させます。引数は浮動小数点数である場合があります。たとえば、3.14%0.7 は 0.34 に等しくなります (3.14 は 4*0.7 + 0.34 に等しいため)。モジュロ演算子は常に、2 番目のオペランドと同じ符号 (またはゼロ) の結果を返します。結果の絶対値は、2 番目のオペランドの絶対値より厳密に小さくなります。


TL;DR:

モジュロ関数( mod 関数とも呼ばれます) は基本的に、最初の数を割った余りを返します。秒までに。だからa % b = cmp(b, 0) * abs(a - (a // b))(と思う)。

于 2012-12-07T16:44:38.873 に答える
1

チェックを etc に変更しますi % 5 == 0。そうすることで、チェックは 5 行ごとに true を返します。

if i % 5 == 0:
    outfile.write("Name: "+line.strip()+"\n")
elif i % 5 == 1:
    outfile.write("Gender: "+line.strip()+"\n")
elif i % 5 == 2:
    outfile.write("Age: "+line.strip()+"\n")
elif i % 5 == 3:
    outfile.write("Height: "+line.strip()+"\n")
elif i % 5 == 4:
    outfile.write("Weight: "+line.strip()+"\n")
于 2012-12-07T16:44:18.343 に答える
0

問題を調査するためのちょうど別の方法

fields = ('Name', 'Gender', 'Age', 'Height', 'Weight')
with open("infile.txt") as fin, open("altered.txt","w") as fout:
    while True:
        data =  ''.join(map(':'.join,zip(fields,fin)))
        if data:
            fout.write(data)
        else:
            break
于 2012-12-07T16:58:20.613 に答える