有一个固定格式的大文件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)
答案 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中替换的代码,则需要添加查询以检查是否有正确的代码。这不是什么大事,但是这个脚本将解决你给我们的文件的问题。
如果您有任何疑问或需要更多帮助,请随时提出。
编辑:除了你在问题代码中所做的一些语法错误和错误的方法调用之外,你不应该一次性读取保存在文件中的整个数据,特别是如果你知道文件会变得非常大。这会消耗大量内存,并可能导致程序运行速度非常慢。这就是为什么逐行迭代要好得多。我提供的示例一次只读取文件的一行并直接将其写入新文件,而不是将旧文件和新文件保存在内存中并将其写为最后一步。