2

次の 2 種類の txt ファイルがあります。

ファイル1

Sample1012, Male, 36, Stinky, Bad Hair
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me
Sample23905, Female, 42, Cougar, Long Hair, Chub
Sample123, Male, 32, Party Guy

ファイル2

DEAD, Sample123, Car Accident, Drunk, Dumb
ALIVE, Sample1012, Alone
ALIVE, Sample23905, STD
DEAD, Sample1043, Too Hot, Exploded

サンプル フィールドに基づいてこれらのファイルを結合する単純な Python スクリプトを書きたいだけですが、データ列の乱数に関する問題が発生し続けます。たとえば、私は次のようになります。

Sample1012, Male, 36, Stinky, Bad Hair, ALIVE, Sample1012, Alone
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me, DEAD, Sample1043, Too Hot, Exploded
Sample23905, Female, 42, Cougar, Long Hair, Chub, ALIVE, Sample23905, STD
Sample123, Male, 32, Party Guy, DEAD, Sample123, Car Accident, Drunk, Dumb

私が欲しいのは:

Sample1012, Male, 36, Stinky, Bad Hair, EMPTY COLUMN, EMPTY COLUMN, ALIVE, Sample1012, Alone
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me, DEAD, Sample1043, Too Hot, Exploded
Sample23905, Female, 42, Cougar, Long Hair, Chub, EMPTY COLUMN, ALIVE, Sample23905, STD
Sample123, Male, 32, Party Guy, EMPTY COLUMN, EMPTY COLUMN, EMPTY COLUMN, DEAD, Sample123, Car Accident, Drunk, Dumb

基本的に、.readlines() を使用して両方のファイルを読み取り、関連する列とサンプル ID を単純な「==」で比較し、true の場合は最初のファイルと 2 番目のファイルの行を出力します。

len() を使用して file1 の最大列数を決定する方法がわからないため、他のファイルから行を追加する前に、各行の最後で最大列数でない場合にそれを考慮することができます ( "==" は真です)。

どんな助けでも大歓迎です。

アップデート:

これは私が今得たものです:

import sys
import csv

usage = "usage: python Integrator.py <table_file> <project_file> <outfile>"
if len(sys.argv) != 4:
    print usage
    sys.exit(0)

project = open(sys.argv[1], "rb")
table = open(sys.argv[2], "rb").readlines()
outfile = open(sys.argv[3], "w")

table[0] = "Total Table Output \n"

newtablefile = open(sys.argv[2], "w")
for line in table:
    newtablefile.write(line)

projectfile = csv.reader(project, delimiter="\t")
newtablefile = csv.reader(table, delimiter="\t")

result = []

for p in projectfile:
    print p
    for t in newtablefile:
        #print t
        if p[1].strip() == t[0].strip():
            del t[0]
            load = p + t
            result.append(load)


for line in result:
    outfile.write(line)

outfile.close()

for ループを一緒に動作させることができません - 停止時のばかげたことは気にしないでください。ファイルの 1 つは最初の行が空白です。

4

4 に答える 4

1

提案された出力の「空の列」がどこから来たのかわかりません...列が定義されたパターンと一致するはずの場合、入力ファイルに空白のスポットが必要です。そうでなければ、これは機能します...

import csv


f1 = open("test1.txt", 'rb')
reader1 = csv.reader(f1)
f2 = open("test2.txt", 'rb')
reader2 = csv.reader(f2)
result = []

for entry in reader1:
    print entry
    for row in reader2:
        print row
        if entry[0].strip() == row[1].strip():
            del row[1]
            load = entry + row
            result.append(load)

for line in result:
    print line

編集 -

ファイルの 1 行をスキップする必要がある場合は、次の入力行にポインターを移動する reader1.next() を実行できます。

あなたの例では、出力ファイルを作成し、それにデータを書き込んでから、ファイルを閉じて再度開いたり、読み取り可能および書き込み可能として開いたりすることなく、それを読み取ろうとします...私はそれに誓うことができませんでしたが、私は思うそれはおそらくあなたの問題です。幸いなことに、とにかく .next() メソッドを使用してそのすべてを行う必要はありません。

于 2013-09-18T03:43:36.970 に答える
0

うーん、おそらく効率のためにrdbmsを使用する必要がありますが、辞書を使用してこれをより適切に行うことができます。

最初のもので使用するときはreadline()、最初のコンマの前にすべてを分割し、それをキーとして使用し、値をリストにします。

のようなもの

{'Sample1012': ['Sample1012', 'Male', 36, 'Stinky', 'Bad Hair']}

今できることは、他のファイルと同じです

そして簡単に言えば、

for key in dict1.keys:
    dict1[key] += dict2.get(key, [])

これにより、対応するすべてのものが最初の辞書に追加されます..

これだけで生活が楽になります

于 2013-09-18T03:25:27.413 に答える
0
with open('file1') as f1, open('file2') as f2:
    dic = {}
    #Store the data from file2 in a dictionary, with second column as key
    for line in f2:
        data = line.strip().split(', ')
        key = data[1]
        dic[key] = data
    #now iterate over each line in file1
    for line in f1:
        data = line.strip().split(', ')
        #number of empty columns = `(7-len(data))`
        data = data + ['EMPTY COLUMN']*(7-len(data))
        print '{}, {}'.format(", ".join(data), ', '.join(dic[data[0]]))

出力:

Sample1012, Male, 36, Stinky, Bad Hair, EMPTY COLUMN, EMPTY COLUMN, ALIVE, Sample1012, Alone
Sample1043, Female, 28, Hot, Short Hair, Hot Body, Hates Me, DEAD, Sample1043, Too Hot, Exploded
Sample23905, Female, 42, Cougar, Long Hair, Chub, EMPTY COLUMN, ALIVE, Sample23905, STD
Sample123, Male, 32, Party Guy, EMPTY COLUMN, EMPTY COLUMN, EMPTY COLUMN, DEAD, Sample123, Car Accident, 
于 2013-09-18T03:29:57.587 に答える
0

ファイル全体をリストのリストに取得し、次を使用してフィールドの最大数を見つけることができます。

file1 = open("file1.txt")
list1 = [s.split(",") for s in file1]
file1.close()
maxlen1 = max([len(x) for x in list1])

辞書は、2 番目のファイルの検索に最適な構造です

file2 = open("file2.txt")
dict2 = { }
for line2 in file2:
    cols2 = line2.split(",")
    dict2[cols2[1]] = cols2
file2.close()

ここで、cols1list1 の列のリストがある場合は、次を使用できます。

cols3 = cols1 + (maxlen1 - len(cols1))*[" EMPTY COLUMN"] + dict2[cols1[0]]

...必要に応じて「EMPTY COLUMN」値で埋められたリストを作成します。これで、次のようにして単一の文字列に戻すことができます。

",".join(cols3)

文字列をトリミングしようとしなかったので、コンマの後には以前と同じスペースができます。「DEAD」、「ALIVE」などの前にスペースがないという小さな問題があります。dict2 を作成するとき、または cols3 を抽出するときに、その変更を加えることができます。

ファイル I/O エラー処理もありません。スニペットはスニペット。

于 2013-09-18T03:35:43.327 に答える