0

次のような2つの別々のファイルからテキストを取得しようとしています:

File 1:
000892834     13.663      0.098      0.871      0.093      0.745      4.611       4795

File 2:
892834  4916   75   37  4857 130 128  4795  4.61 -0.09    0 0

次のような出力を取得します。

892834     13.663      0.098      0.871      0.093      0.745      4.611       4795
892834     4916        4795       -0.09

解決策に近いと思われるコードがいくつかあります。

filter_func_1 = lambda x: x >= 15   
filter_func_2 = lambda x: (5777 + 100) > x > (5777 - 100)
mergedData = defaultdict(list)
with open('Table1_Karoff.txt') as file_1, open('Table7_Pinsonneault.txt') as file_2, open('Processed_Data.txt', 'w') as outfile:
        for line_1 in file_1:
            splt_file_1 = line_1.split()
            if filter_func_1(splt_file_1[1]):
                 mergedData[splt_file_1[0].lstrip('0')].append(line_1)
        for line_2 in file_2:
                splt_file_2 = line_2.split()
        Data = map(itemgetter(0, 1, 8, 9), line_2)
            if filter_func_2(splt_file_2[1]):
                 mergedData[splt_file_2[0]].append(['   '.join(map(str, i)) for i in Data])
        for k in mergedData:
            if len(mergedData[k]) == 2:
                outfile.write("\n".join(mergedData[k]) + "\n")          
        return outfile

このコードが「想定」しているのは、ラムダ演算子を使用して 2 種類のフィルターを作成し、各行の特定のインデックスをラムダ関数と比較して、それが true かどうかを確認し、そうであれば、その行全体をリストに追加して出力することです。 . また、ファイル 1 の最初の数字の先頭から '000' を取り除き、同じ最初の数字が両方のファイルに存在することを確認します。

私の問題は次のとおりです。

1) file_1 ID # (その最初の番号) からすべての 0 が正しく削除されていませんが、私の知る限り、コードはそれを行う必要があります。00892834 として出力されるため、最初の 0 のみが削除されます。

2) フィルターを追加した後、新しいファイルにデータがまったく書き込まれませんでした。line.split が新しいリストを適切に作成したかどうかを確認したところ、作成されていませんでした。つまり、フィルター処理するデータがありませんでした。 splt_file_# 入力にデータがなかったためです。これは私には奇妙で、どうしてそうなるのか理解できません。最後に、splt_file_1 および splt_file_2 リストを書き出すはずの writeline を追加して、リストの作成をテストしましたが、何も吐き出されませんでした。

3) 必要な値はファイル 2 のリストで順番に呼び出すことができないため (インデックス 0、1、8、9 のみが必要です)、データをマップしてからフォーマットしようとしましたが、これによりインデックスが範囲外の問題になります。上記の#2の問題のために理解できます。

これらのエラーを削除するための助けが必要です。コードが間違っているのか、何か不足しているだけなのかわかりません。助けてくれてありがとう。

4

2 に答える 2

1

解決策を修正しないで申し訳ありませんが、別のテイクも役立つ場合があります。私があなたを正しく理解していれば、これは私のコードになります。

file_1_data = dict()
file_2_data = dict()
for filename, data in [('infile1.txt', file_1_data), ('infile2.txt', file_2_data)]:
with open(filename) as f:
    for line in f:  
        split_line = line.split()       
        first_int = int(split_line[0])
        rest_floats = [float(f) for f in split_line[1:]]
        data[first_int] = rest_floats

これで、キーが である両方のファイルの辞書がintできたので、それらを比較できます。値は float のリストです。この後はかなり簡単です。

def filter_1(x):
return x > 1

def filter_2(x): 
return 4 < x < 100000

with open('outfile.txt', 'wb') as outfile:
for key in file_1_data:
    if key in file_2_data:
        #write a record, the first one
        data_to_write = [str(f) for f in file_1_data[key] if filter_1(f)]       
        record = '  '.join([str(key)] + data_to_write) + '\n'
        outfile.write(record)
        #second one, do filtering here
        data_to_write = [str(f) for f in file_2_data[key] if filter_2(f)]
        record = '  '.join([str(key)] + data_to_write) + '\n'   
        outfile.write(record)

それが役に立てば幸い。ここでの私のポイントは次のとおりだと思います: 少し冗長または単純化することを心配しないでください。幸運を。

于 2013-07-09T18:08:43.490 に答える
1

文字列を渡して、ラムダ内の整数と比較していますfilter_func_1filter_func_2しかし、数値と文字列を比較すると、比較は縮退します: 数値は常に文字列の前にあると見なされます (これは実装固有です。私は CPython の動作を想定しています)。したがって、最初のラムダは常に返さTrueれ、2 番目のFalse. その結果、コード内でフィルターとして機能していません。

渡す文字列を整数または浮動小数点数に変換する必要があります。次に例を示します。

filter_func_1 = lambda x: float(x) >= 15   

または、フィルターに渡す前に入力を変換することもできます。どちらの場合でも、入力を数値型に変換できない場合にどうするかを考える必要があります。

数値型に変換すると、先頭0の s も削除されます。2 番目の問題の解決に役立つ場合もあれば、そうでない場合もありますが、いずれにせよ、コードのこの部分に変更を加えるまで、期待した結果は得られません。

于 2013-07-09T18:57:45.757 に答える