#python
Вопрос:
У меня есть файл .csv, который выглядит так:
Word,2000,2001,2002,Total
alpha,1,1,1
beta,0,1,1
charlie,0,0,1
Я хочу добавить общее значение в каждую строку. Пока мой код выглядит так:
with open (myfile, 'r') as fin:
for row in fin:
total = []
line = 0
for num in row:
if num.isdigit():
line = num
total.append(line)
with open (myfile, 'a') as fout:
fout.write(',' total)
Две проблемы:
- Я не хочу, чтобы он рассчитывал общее количество лет в строке заголовка.
- Я получаю следующее сообщение об ошибке, относящееся к
line = num
коду:TypeError: unsupported operand type(s) for =: 'int' and 'str'
Комментарии:
1. Вам нужно преобразовать
total
в строку, чтобы вы могли объединить ее:fout.write(',' str(total))
2. Заведите привычку подвергать сомнению свои предположения. Поместите
print(num)
в качестве первой строкиfor
цикла, и вы увидите, что вы повторяете не поля, разделенные запятыми, а отдельные символы. Кроме того, существует разница между строкой"1"
и целочисленным значением1
, даже если"1".isdigit()
оно возвращаетсяTrue
.3. Если вы работаете с csv или таблицами в целом, я рекомендую проверить Pandas ( pandas.pydata.org ) для различных полезных операций с таблицами
Ответ №1:
Прежде всего, для чтения и записи CSV-файлов я рекомендую использовать модуль csv. Чтобы отделить заголовки от остальных строк, вы можете использовать встроенные функции iter и next. Вызов iter()
даст вам объект итератора, а next()
при однократном вызове будет получена первая строка из итератора. Затем итератор будет исчерпан циклом for. Вот пример:
import csv
rows = []
with open('data.csv') as csv_file:
csv_iter = iter(csv.reader(csv_file))
rows.append(next(csv_iter))
for row in csv_iter:
total = sum(int(val) for val in row[1:])
rows.append([*row, total])
with open('data.csv', 'w') as csv_file:
csv.writer(csv_file).writerows(rows)
Комментарии:
1. Спасибо, это делает именно то, что я хотел.
Ответ №2:
- Пропустите строку заголовка, прочитав строку перед
for
циклом. - Вам нужно разделить строку на символы, прежде чем переходить по ней.
,
- Вы должны преобразовать числа в целые числа, прежде чем добавлять их.
- Вы не можете записывать в файл, пока читаете его. Открыв его в
a
режиме, вы запишете итоги в конце файла, а не в конце текущей строки. Вы должны добавить в переменную, содержащую текущую строку, а затем переписать весь файл в конце. - Вам нужно удалить новую строку перед добавлением в строку и добавить ее обратно при сохранении для записи позже.
- Вам нужно преобразовать число в строку, чтобы объединить его.
Обновленный скрипт:
all_rows = []
with open (myfile, 'r') as fin:
all_rows.append(myfile.readline()) # Skip header line
for row in fin:
row.rstrip() # remove trailing newline
line = 0
for num in row:
if num.isdigit():
line = int(num)
row = ',' str(line) 'n'
all_rows.append(row)
with open (myfile, 'w') as fout:
fout.writelines(all_rows)
Ответ №3:
Попробуй это
for row in fin:
all_numbers = [int(x) for x in row.split(',') if x.isdigit()]
total = str(sum(all_numbers))
Ответ №4:
1.У вас может быть переменная, которая является ложной при запуске, но затем становится истинной в цикле, как это:
first==False
with open (myfile, 'r') as fin:
for row in fin:
if not first:
first=True
else:
total = []
line = 0
for num in row:
if num.isdigit():
line = num
total.append(line)
with open (myfile, 'a') as fout:
fout.write(',' total)
2.Элементами row
являются строки. Изменение его на line =int(num)
должно исправить ошибку.