У меня уже есть файл CSV, к которому я обращаюсь, и я хочу добавить данные в первую строку, но он записывает данные в конец файла.
Что я получаю:
Но я хочу, чтобы данные добавлялись следующим образом:
Код, который я сделал до сих пор:
import CSV
with open('explanation.csv' , 'a', newline="") as file:
myFile = csv.writer(file)
myFile.writerow(["1"])
Вы можете прочитать весь файл, добавить свои строки в память, а затем записать весь файл:
def append(fname, data):
with open(fname) as f:
reader = csv.reader(f)
data = list(reader) + list(data)
with open(fname, 'w') as f:
writer = csv.writer(f)
writer.writerows(data)
То, что вы на самом деле хотите сделать, это данные заменять в существующем файле CSV с новыми значениями, однако, чтобы обновить файл CSV, вы должны переписать все это.
Один из способов сделать это — прочитать все это в память, обновить данные, а затем использовать их для перезаписи существующего файла. В качестве альтернативы вы можете обрабатывать файл построчно и сохранять результаты во временном файле, а затем заменять оригинал временным файлом, когда закончите обновлять их все.
Код для последнего показан ниже:
import csv
import os
from pathlib import Path
from tempfile import NamedTemporaryFile
filepath = Path('explanation.csv') # CSV file to update.
with open(filepath, 'r', newline='') as csv_file, \
NamedTemporaryFile('w', newline='', dir=filepath.parent, delete=False) as tmp_file:
reader = csv.reader(csv_file)
writer = csv.writer(tmp_file)
# Replace value in the first column of the first 5 rows.
for data_value in range(1, 6):
row = next(reader)
row[0] = data_value
writer.writerow(row)
writer.writerows(reader) # Copy remaining rows of original file.
# Replace original file with updated version.
os.replace(tmp_file.name, filepath)
print('CSV file updated')
Желание записать новые данные в середине файла, но сохранить старые данные — распространенный вопрос новичка. Файлы не похожи на окна редактора, где вы можете просто поместить курсор и начать вставку; вы должны сохранить старые данные в памяти и переписать файл, или записать его в отдельный новый файл.