如何打开读写文件并重新创建文件?

时间:2013-11-04 18:18:18

标签: python parsing read-write

我想

  • 打开并阅读第一个文件
  • 打开并阅读第二个文件
  • 使用标题
  • 将第二个文件的值复制到第一个文件
  • 将新值写入第一个文件

即,第一个文件作为读写模式打开,第二个文件作为读取模式打开。 例如,

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

所以,首先要将标题,1)VIETNAMESE和2)TOTAL写入1st_file的标题。

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

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

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

怎么做?

4 个答案:

答案 0 :(得分: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()

既然您正在使用变量而不是文件,那么......

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))

答案 1 :(得分: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”选项将删除上一个文件并创建一个新文件。因此,请在尝试之前确保备份数据。

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

您要写回的最终数据表是一个二维矩阵,因此您只需执行table[i][j] = "New Data"即可在(i,j)处编辑任何条目。

答案 2 :(得分: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 :(得分: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文件或任何您想要的文件并应用格式。