2

したい

  • 最初のファイルを開いて読み取る
  • 2 番目のファイルを開いて読み取る
  • 2 番目のファイルの値をヘッダー付きの 1 番目のファイルにコピーします
  • 新しい値を最初のファイルに書き込みます

つまり、1 番目のファイルは読み取り/書き込みモードで開かれ、2 番目のファイルは読み取りモードで開かれます。例えば、

1st_file

     CHINESE    JAPANESE   KOREAN
CA   0.1        0.1        1.1
WA   0.2        -0.2       1.3
OR   -0.1       1.1        0.1
UT   0.3        1.4        -0.9

2nd_file (ヘッダーなし)

1.1
1.3
-0.1
1.3

再作成された 1st_file

     CHINESE    JAPANESE   KOREAN    VIETNAMESE   TOTAL
CA   0.1        0.1        1.1       1.1          2.4
WA   0.2        -0.2       1.3       1.3          2.6
OR   -0.1       1.1        0.1      -0.1          1.0
UT   0.3        1.4        -0.9      1.3          2.1

ここで、2nd_file には VIETNAMESE 列に関する値が含まれています。

したがって、最初に、1st_file のヘッダーに 1) VIETNAMESE と 2) TOTAL というヘッダーを書き込みます。

次に、2nd_file の値を 1st_column の対応する VIETNAMESE 列に書き込みます。

最後に、1st_column の値を計算し、それ (TOTAL など) を 1st_column に書き込みます。

最初のファイルを r+ モードで開こうとしましたが、うまくいきませんでした。参考までに、実際の 1st_files には、約 1 億の行と 20 の列があります。

どうやってするの?

4

4 に答える 4

0

readlines()テキストファイルの編集に使用することを好みます。これでうまくいくはずです:

fileA = open("whatever the file name of first file is", 'r')
fileALines = fileA.readlines()
fileA.close()

fileB = open("whatever the file name of second file is", 'r')
fileBLines = fileB.readlines()
fileB.close()

newLines []

newLines[0] = fileALines[0] "VIETNAMESE  TOTAL"  #I'm not sure how you intend on getting the column header, but you can just insert it here.

lengthList = [len(header) for header in fileALines[0]] #Used for column widths

for lineA,lineB in zip(fileALines[1:],fileBLines):
    itemList = (lineA + lineB).split()
    itemList.append(str(sum(map(float,itemList))))
    for length,item in zip(lenghtList,itemList):
        newLines.append("{:^{length}}".format(item, length=length))
    newLines.append("\n")

fileC = open("newFile.txt", 'w')
for line in newLines:
    fileC.write(line)
fileC.close()

私が書いたコードを使用すると、問題が発生した場合にデバッグに使用できる 3 番目のファイルが作成されます。

このコードは次の場合には機能しません:

  • 2 つのファイルの行数が異なる (ヘッダー行を除く)
  • ヘッダーよりも広い数字があります
  • 合計列がヘッダーよりも広くなります
  • 私はある種のばかげたエラーを犯しました

コメントやその他の回答にも同意します。テキストファイルはおそらく最善の方法ではありませんが、実行できます。お役に立てれば。

于 2013-11-04T19:21:31.860 に答える
0

すばやく構造化されたファイルが必要な場合は、python の csv ライブラリを使用します。

import csv
main_headers = ['state', 'chinese']
compound_data = []
with open('languages1.csv', 'r') as csv_file:
    csvreader = csv.DictReader(csv_file)
    for row in csvreader:
        compound_data.append(row)
print(compound_data)
with open('languages2.csv', 'r') as csv_file:
    csvreader = csv.DictReader(csv_file)
    for row in csvreader:
    compound_data.append(row)
print(compound_data)

出力:

[{'state': 'ca', 'chinese': '1.0'}, {'state': 'vt', 'chinese': '2.0'}]
[{'state': 'ca', 'chinese': '1.0'}, {'state': 'vt', 'chinese': '2.0'}, {'state': 'ca', 'vietnamese': '-0.1'}, {'state': 'vt', 'vietnamese': '1.5'}]

データを取得したら、csv ファイルまたは任意のファイルに書き換えて、書式設定を適用できます。

于 2013-11-04T19:38:26.880 に答える
0

次のコードを試すことができます:

FILE_1 = "File1.in"
FILE_2 = "File2.in"


def getTableData(file_name):
    """Retreive the Table Data from 'file_name' and return it as a list()"""
    file_1 = open(file_name,'r')
    data =  [cols.split() for cols in file_1.read().split('\n')]
    data[0].insert(0,' ')
    return data

def getColumn(file_name):
    """Retrieve the new Column data from file 'file_name' and return it as a list"""
    file_2 = open("File2.in", 'r')  
    col = file_2.read().split('\n')
    return col

def appendColumn(table, col_name, col):
    """Append the new Column to the table"""
    table[0].append(col_name)
    for x in xrange(len(col)):
        table[x+1].append(col[x])
    return table

def total(table):
    """Calculate the Total in the table"""
    col =[]
    for i in xrange(len(table)-1):
        tot = 0.0
        for j in xrange(len(table[i+1])-1):
            tot += float(table[i+1][j+1])
        col.append(str(tot))
    return col

def writeBack(file_name, table):
    """Writing the table back to 'file_name'"""
    fout = open(file_name,"w")
    for row in table:
        line = '\t\t'.join(row)
        fout.write(line + "\n")


table = appendColumn(getTableData(FILE_1), "VIETNAMESE", getColumn(FILE_2))
col = total(table)
table = appendColumn(table, "TOTAL", col)
writeBack(FILE_1, table)

制限:

  • 最終的な出力ファイルに印刷される列は、適切にインデントされません。インデントをいじる必要があります。現在、各列は 2 つの '\t'で区切られています。
  • このコードは、追加される新しい列の行数が既存のテーブルと同じ場合にのみ機能します。
  • すでに述べたようSaelythに、「w」オプションは以前のファイルを削除して新しいファイルを作成します。そのため、これを試す前に必ずデータをバックアップしてください。

また、新しい列名が 2 番目のファイルに含まれておらず、別のソースから受け取っていると想定しています。

書き戻す最終的なデータ テーブルは 2 次元行列であるため、(i,j) の任意のエントリを編集するだけで編集できますtable[i][j] = "New Data"

于 2013-11-04T19:15:34.790 に答える