2

我想要

  • 打开并读取第一个文件
  • 打开并读取第二个文件
  • 将第二个文件的值复制到带有标题的第一个文件
  • 将新值写入第一个文件

也就是说,第一个文件以读写模式打开,第二个文件以读取模式打开。例如,

第一个文件

     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

第二个文件(无标题)

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 列的值。

因此,第一件事是将标题 1) VIETNAMESE 和 2) TOTAL 写入 1st_file 的标题。

然后,将 2nd_file 中的值写入 1st_column 对应的 VIETNAMESE 列。

最后,计算 1st_column 的值并将其(如 TOTAL)写入 1st_column。

我尝试使用 r+ 模式打开第一个文件,但效果不佳。仅供参考,真正的 1st_files 有大约 1 亿行和 20 列。

怎么做?

4

4 回答 4

1

虽然我同意 iCodez 并且您不应该使用 txt 文件(可能是 SQL 甚至 json)...我会给您一个替代方案。

file1 = open("example.txt", "r")
alldatainfile1 = file1.read()
file1.close()

file2 = open("example.txt", "r")
alldatainfile2 = file2.read()
file2.close()

现在您正在使用 vars 而不是文件,您可以...

file1 = open("example.txt", "w")
file1.write(alldatainfile2)
file1.close()

请注意,我使用“w”写入文件(将删除所有信息然后保存新信息),但如果您只想向文件添加信息而不是删除所有信息,则应使用“a”附加数据。

最后我建议3个技巧:

  • 在尝试之前备份您的文件,删除重要信息的机会很高。
  • 使用For line in yourfile代码检查信息是否已经存在,如果是这样,请不要复制它,但应该使用 json 正确完成。
  • 如果那是 json 会很容易,因为不是我会尝试给你一个代码来计算一行的总数。

您可以执行以下代码:

total = 0
for line in alldatainfile1:
  linesplit.split("   ") #3 whitespaces, since you got it that way
  total = total + line[1]
print("total of column1: " + str(total))
于 2013-11-04T19:06:43.390 回答
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)

限制:

  • 将在最终输出文件中打印的列将不会正确缩进。您将不得不使用缩进。目前每列由两个'\t'分隔。
  • 仅当添加的新列与现有表具有相同的行数时,该代码才有效。
  • 如前所述Saelyth,“w”选项将删除以前的文件并创建一个新文件。因此,请确保在尝试之前备份您的数据。

我还假设新的列名不包含在第二个文件中,并且它是从不同的来源接收的。

您写回的最终数据表是一个二维矩阵,因此您可以通过简单地编辑 (i,j) 处的任何条目table[i][j] = "New Data"

于 2013-11-04T19:15:34.790 回答
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()

使用我编写的代码将创建第三个文件,如果您有任何问题,您可以使用它来调试它。

如果出现以下情况,此代码将不起作用:

  • 您的两个文件中有不同的行数(不包括标题行)
  • 你有一个比标题更宽的数字
  • 您的总和列最终比标题更宽
  • 我犯了某种愚蠢的错误

我也同意评论和其他答案,文本文件可能不是最好的方法,但可以做到。希望这可以帮助。

于 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 回答