我有两个.csv文件我在一个(文件a)中查找数据并将其与另一个(文件b)匹配一旦我找到b中的相应行我想写入相应行中的特定单元格。另外我需要迭代这个,所以我可能会多次写入文件b中的每一行。
我可以写一个csv文件然后一遍又一遍地读它吗?
def match(name, group, cnum):
for data in masterfile_list:
if (name in data[0]):
if (group in data[4]):
if (cnum == "112"):
data[7] = cnum
elif (cnum == "111"):
data[8] = cnum
elif (cnum == "110"):
data[9] = cnum
elif (cnum == "109"):
data[10] = cnum
elif (cnum == "108"):
data[11] = cnum
elif (cnum == "107"):
data[12] = cnum
elif (cnum == "106"):
data[13] = cnum
elif (cnum == "105"):
data[14] = cnum
elif (cnum == "104"):
data[15] = cnum
elif (cnum == "103"):
data[16] = cnum
elif (cnum == "102"):
data[17] = cnum
elif (cnum == "101"):
data[18] = cnum
理想情况下,我会写/替换匹配的行。
答案 0 :(得分:2)
如果文件b不是非常大,我建议使用readlines()
获取所有行的列表,然后迭代列表并根据需要更改行。这比寻找文件中的不同位置和替换行要容易得多。
此外,您可以显着减少函数体中的代码,我可能会这样做:
def match(name, group, cnum):
lookup = dict(zip(map(str, range(112, 100, -1)), range(7, 19)))
for data in masterfile_list:
if name in data[0] and group in data[4] and cnum in lookup:
data[lookup[cnum]] = cnum
答案 1 :(得分:1)
我不确定您的代码片段是如何打开/读取/写入有问题的文件的。
要做你想要的描述,如果文件不是太大,我会把相关的源文件读入内存,改变你需要在内存中的结构,然后把结果写出来。
伪代码
file_a=open('file_a','r')
file_b_things=open('file_b','r').readlines()
new_things_file=open('new_things','w')
new_things=[]
for thing in file_a:
if thing in file_b_things:
new_thing=do_something_with(thing)
new_things.append(new_thing)
for new_thing in new_things:
new_things_file.write(new_thing)
答案 2 :(得分:0)
更换文件中的行通常并不容易。通常,如果要进行更改,则必须重写文件(以安全的方式)。
除非您确切知道线条大小不会改变,否则您可以在阅读一行之前ftell()
,然后再seek()
。但即使这样也不太安全,因为python中的readline()
内容会做一些缓冲,即文件指针比它应该更接近结束。