Как переписать только одно поле (строка [n]) в csv, но при этом иметь возможность работать с данными?
У меня есть файл csv с тремя строками и тремя столбцами.
Сначала я хочу напечатать все строки. Впоследствии для каждого из них программа проверяет, записано ли оно во втором поле (индекс 1) USA. Если это так, программа возьмет цену из третьего поля и умножит ее на два.
Теперь мне нужно переписать эту удвоенную цену вместо 2000 (по США)
import csv
with open('countries.csv', 'r') as source:
reader = csv.reader(source)
writer = csv.writer(source)
for line in reader:
print(*line, sep=';')
with open('countries.csv', 'r') as source:
reader = csv.reader(source)
for line in reader:
if line[2] == "USA":
actual_price = int(line[2])
print(actual_price)
new_price = int(actual_price) * 2
print(new_price)
Кто-то уже посоветовал мне воспользоваться созданием нового файла. Но это вызывает проблемы, когда я хочу сначала поработать с данными в файле.
import csv
import os
with open('countries.csv', mode='r') as oldfile, open(
'countries.tmp', mode='w', newline='') as newfile:
# define a reader and a writer
reader = csv.reader(oldfile, delimiter=';', quotechar='"')
writer = csv.writer(newfile, delimiter=';', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
for line in reader:
print(*line, sep=';')
# copy everything changing the third field
for line in reader:
if line[2] == "USA":
actual_price = int(line[2])
print(actual_price)
new_price = int(actual_price) * 2
print(new_price)
for row in reader:
writer.writerow([row[0], row[1], ,new_price])
# ok, time to rename the file
os.replace('countries.tmp', 'countries.csv')
Спасибо за ответ
1 ответ
Решение
Ты меняешься
new_price
на каждой итерации вашего
for
петля. Поэтому вы должны писать строку внутри цикла, в которой вы меняете значение:
with open('countries.csv', mode='r') as oldfile, open('countries.tmp', mode='w', newline='') as newfile:
reader = csv.reader(oldfile, delimiter=';', quotechar='"')
writer = csv.writer(newfile, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
for row in reader:
price = int(row[2])
if row[1] == "USA":
price = price*2
writer.writerow([row[0], row[1], price])
os.replace('countries.tmp', 'countries.csv')