Модуль Python CSV для чтения и записи одновременно - PullRequest
0 голосов
/ 25 августа 2011

У меня есть два файла .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 ]

2 голосов
/ 25 августа 2011

Если файл 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 голос
/ 25 августа 2011

Я не уверен из вашего фрагмента кода, как вы открываете / читаете / записываете рассматриваемые файлы.

Чтобы сделать то, что вы описываете, что вы хотите, и если файлы не слишком велики, я бы прочитал соответствующие исходные файлы в память, изменил структуры, которые вам нужны в памяти, а затем записал результат в файл.

псевдокод

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)
0 голосов
/ 25 августа 2011

Обычно не так просто заменить строки в файле.Обычно вам нужно переписать файл (безопасным способом), если вы хотите внести изменения.

За исключением случаев, когда вы точно знаете, что размер строки не изменится - тогда вы могли бы ftell() перед чтениемлиния и seek() потом.Но даже это не совсем безопасно, потому что readline() в Python выполняет некоторую буферизацию, то есть указатель файла ближе к концу, чем должен быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...