使用file1中的数据更新file2中的记录

时间:2016-06-06 09:08:08

标签: python algorithm file-io

有一个固定格式的大文件file1。另一个CSV文件,file2具有id和值,使用它们,需要更新file1中具有相同id的记录的特定部分。这是我的尝试。我非常感谢您为此工作提供的任何帮助。

file2逗号分隔

clr,code,type
Red,1001,1
Red,2001,2
Red,3001,3
blu,1002,1
blu,2002,2
blu,3002,3

file1(固定宽度格式)

clrtyp1typ2typ3notes
red110121013101helloworld
blu110221023102helloworld2

file1需要更新为以下

clrtyp1typ2typ3notes
red100120013001helloworld
blu100220023002helloworld2

请注意,这两个文件都是相当大的文件(每个文件多个GB)。我是python noob,请原谅任何重大错误。我非常感谢您提供的任何帮助。

import shutil
#read both input files
file1=open("file1.txt",'r').read()
file2='file2.txt'

#make a copy of the input file to make edits to it. 
file2Edit=file2+'.EDIT'
shutil.copy(file2, baseEdit)
baseEditFile = open(baseEdit,'w').read()

#go thru eachline, pick clr from file1 and look for it in file2, if found, form a string to be replaced and replace the original line. 
with open('file2.txt','w') as f:
    for line in f:
        base_clr = line[:3]
        findindex = file1.find(base_recid)
        if findindex != -1:
            for line2 in file1:
                #print(line)
                clr = line2.split(",")[0]
                code = line2.split(",")[1]
                type = line2.split(",")[2]
                if keytype = 1:
                    finalline=line[:15]+string.rjust(keyid, 15)+line[30:]
                    baseEditFile.write( replace(line,finalline)
                    baseEditFile.replace(line,finalline)

1 个答案:

答案 0 :(得分:2)

如果我找对你,你需要这样的东西:

# declare file names and necessary lists
file1 = "file1.txt"
file2 = "file2.txt"
file1_new = "file1.txt.EDIT"
clrs = {}

# read clrs to update
with open(file1, "r") as f:
    # skip header line
    f.next()
    for line in f:
        clrs[line[:3]] = []

# read the new codes
with open(file2, "r") as f:
    # skip header
    f.next()
    for line in f:
        current = line.strip().split(",")
        key = current[0].lower()
        if key in clrs:
            clrs[key].append(current[1])

# write the new lines (old codes replaced with the new ones) to new file
with open(file1, "r") as f_in:
    with open(file1_new, "w") as f_out:
        # writes header
        f_out.write(f_in.next())
        for line in f_in:
            line_new = list(line)
            key = line[:3]
            # checks if new codes were found for that key
            if key in clrs.keys():
                # replaces old keys by the new keys
                line_new[3:15] = "".join(clrs[key])
            f_out.write("".join(line_new))

对于给定的示例,这仅适用于 。如果您的文件具有实际使用的其他格式,则必须调整使用的索引。

这个小脚本首先打开你的文件1,迭代它,然后将clr作为字典的关键字添加。该键的值是一个空列表。 然后它打开file2,并在这里迭代每个clr。如果clr在字典中,它会将代码附加到列表中。因此,在运行此部分之后,字典包含键,值对,其中键是clr,值是包含代码的列表(按文件给出的顺序)。

在脚本的最后一部分中,file1.txt的每一行都写入file1.txt.EDIT。在编写之前,旧代码将被新代码替换。

保存在file2.txt中的代码必须与它们保存在file1.txt中的顺序相同。如果订单可能不同,或者file2.txt中的代码可能多于您需要在file1.txt中替换的代码,则需要添加查询以检查是否有正确的代码。这不是什么大事,但是这个脚本将解决你给我们的文件的问题。

如果您有任何疑问或需要更多帮助,请随时提出。

编辑:除了你在问题代码中所做的一些语法错误和错误的方法调用之外,你不应该一次性读取保存在文件中的整个数据,特别是如果你知道文件会变得非常大。这会消耗大量内存,并可能导致程序运行速度非常慢。这就是为什么逐行迭代要好得多。我提供的示例一次只读取文件的一行并直接将其写入新文件,而不是将旧文件和新文件保存在内存中并将其写为最后一步。