Python CSV模块同时读取和写入

0 投票
3 回答
2583 浏览
提问于 2025-04-17 00:17

我有两个.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 

我希望能写入/替换匹配的那一行。

3 个回答

0

一般来说,替换文件中的某一行并不简单。通常,如果你想做修改,就得重新写一遍整个文件(要确保安全)。

不过,如果你非常确定那一行的大小不会改变,那么你可以在读取这一行之前用 ftell() 来获取当前的位置,然后在读取之后用 seek() 回到那个位置。但即便如此,这种方法也不太安全,因为 Python 中的 readline() 会进行一些缓存处理,也就是说,文件指针可能会比实际应该在的位置更靠近文件的末尾。

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

如果文件 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

撰写回答