Подтвердить что ты не робот

Читать и писать на одном и том же файле csv

Я пытаюсь читать и писать в том же файле CSV:

file1 = open(file.csv, 'rb')
file2 = open(file.csv, 'wb')
reader = csv.reader(file1)
writer = csv.writer(file2)
for row in reader:
   if row[2] == 'Test':
      writer.writerow( row[0], row[1], 'Somevalue')

Мои файлы csv:

  • val1,2323,Notest
  • val2, 2323,Test

Итак, в основном, если значение row[2] Test, я хочу заменить его на Some new value. Вышеприведенный код дает мне пустые CSV файлы.

4b9b3361

Ответ 1

Вы должны использовать другое имя выходного файла. Даже если вы хотите, чтобы имя было одинаковым, вы должны использовать некоторое временное имя и, наконец, переименовать файл.

Когда вы открываете файл в режиме "w" (или "wb" ), этот файл "очищается" - содержимое всего файла исчезает. Документация на Python для open() говорит:

... 'w' только для записи (существующий файл с тем же именем будет удален),...

Итак, ваш файл стирается, прежде чем функции csv начнут его разбор.

Ответ 2

Вы не можете открывать файл в режимах читать и писать одновременно.

Ваш код может быть изменен следующим образом: -

# Do the reading
file1 = open(file.csv, 'rb')
reader = csv.reader(file1)
new_rows_list = []
for row in reader:
   if row[2] == 'Test':
      new_row = [row[0], row[1], 'Somevalue']
      new_rows_list.append(new_row)
file1.close()   # <---IMPORTANT

# Do the writing
file2 = open(file.csv, 'wb')
writer = csv.writer(file2)
writer.writerows(new_rows_list)
file2.close()

Как указывает Джейсон, если ваш CSV слишком велик для вашей памяти, вам нужно будет написать другое имя файла, а затем переименуйте его. Это, вероятно, будет немного медленнее.

Ответ 3

Если ваш файл csv недостаточно велик (чтобы взорвать память), прочитайте все это в памяти и закройте файл, прежде чем открывать его в режиме записи.

Или вы должны подумать о записи в новый файл, а не о том же.

Ответ 4

Невозможно открыть один и тот же файл в двух разных режимах в python. Перед открытием файла в другом режиме вы должны выпустить один из указателей файлов с файловым именем .close()!