Читать и писать на одном и том же файле 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 файлы.
Ответы
Ответ 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()!