Мне нужно записать значение в ячейку (например, 8-я ячейка) в моем файле csv. Я вижу, что существует метод csvwriter.writerow(row)
для записи целой строки, но я ничего не вижу, чтобы написать значение для конкретной ячейки.Запись в конкретную ячейку с использованием модуля csv в python
ответ
csv module предоставляет средства для чтения и записи csv-файлов, но не позволяет изменять конкретные ячейки на месте.
Даже метод csvwriter.writerow(row)
, который вы выделяете в своем вопросе, не позволяет идентифицировать и перезаписать определенную строку. Скорее, он записывает параметр row
в файл-файл писателя, фактически он просто добавляет строку csv-файла, связанного с писателем.
Не отвлекайтесь от использования csv module, хотя он прост в использовании и с примитивами, если вы можете реализовать более высокоуровневую функциональность, которую вы ищете относительно легко.
Например, посмотрите на следующий файл CSV:
1,2,3,four,5
1,2,3,four,5
1,2,3,four,5
Слово four
находится в колонке 3 (четвертый столбец, а строка просто список, поэтому индексация с нуля), это может легко обновляется, чтобы содержать цифру 4
со следующей программой:
import csv
in_file = open("d:/in.csv", "rb")
reader = csv.reader(in_file)
out_file = open("d:/out.csv", "wb")
writer = csv.writer(out_file)
for row in reader:
row[3] = 4
writer.writerow(row)
in_file.close()
out_file.close()
, в результате чего на выходе:
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
Предоставлено создание некоторой общей функции, позволяющей идентифицировать и обновлять определенные строки и столбцы, немного больше, но не намного больше, поскольку манипулирование файлом csv в Python - это просто управление последовательностью списков.
Согласен, это раздражает. Я закончил подклассирование csv.DictReader. Это позволяет редактировать данные на основе ячейки, а также дамп. Я код размещен на ActiveState: In place csv lookup, manipulation and export
import csv, collections, copy
"""
# CSV TEST FILE 'test.csv'
TBLID,DATETIME,VAL
C1,01:01:2011:00:01:23,5
C2,01:01:2012:00:01:23,8
C3,01:01:2013:00:01:23,4
C4,01:01:2011:01:01:23,9
C5,01:01:2011:02:01:23,1
C6,01:01:2011:03:01:23,5
C7,01:01:2011:00:01:23,6
C8,01:01:2011:00:21:23,8
C9,01:01:2011:12:01:23,1
#usage (saving this cose as CustomDictReader.py)
>>> import CustomDictReader
>>> import pprint
>>> test = CustomDictReader.CSVRW()
>>> success, thedict = test.createCsvDict('TBLID',',',None,'test.csv')
>>> pprint.pprint(dict(thedict))
{'C1': OrderedDict([('TBLID', 'C1'), ('DATETIME', '01:01:2011:00:01:23'), ('VAL', '5')]),
'C2': OrderedDict([('TBLID', 'C2'), ('DATETIME', '01:01:2012:00:01:23'), ('VAL', '8')]),
'C3': OrderedDict([('TBLID', 'C3'), ('DATETIME', '01:01:2013:00:01:23'), ('VAL', '4')]),
'C4': OrderedDict([('TBLID', 'C4'), ('DATETIME', '01:01:2011:01:01:23'), ('VAL', '9')]),
'C5': OrderedDict([('TBLID', 'C5'), ('DATETIME', '01:01:2011:02:01:23'), ('VAL', '1')]),
'C6': OrderedDict([('TBLID', 'C6'), ('DATETIME', '01:01:2011:03:01:23'), ('VAL', '5')]),
'C7': OrderedDict([('TBLID', 'C7'), ('DATETIME', '01:01:2011:00:01:23'), ('VAL', '6')]),
'C8': OrderedDict([('TBLID', 'C8'), ('DATETIME', '01:01:2011:00:21:23'), ('VAL', '8')]),
'C9': OrderedDict([('TBLID', 'C9'), ('DATETIME', '01:01:2011:12:01:23'), ('VAL', '1')])}
>>> thedict.keys()
['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9']
>>> thedict['C2']['VAL'] = "BOB"
>>> pprint.pprint(dict(thedict))
{'C1': OrderedDict([('TBLID', 'C1'), ('DATETIME', '01:01:2011:00:01:23'), ('VAL', '5')]),
'C2': OrderedDict([('TBLID', 'C2'), ('DATETIME', '01:01:2012:00:01:23'), ('VAL', 'BOB')]),
'C3': OrderedDict([('TBLID', 'C3'), ('DATETIME', '01:01:2013:00:01:23'), ('VAL', '4')]),
'C4': OrderedDict([('TBLID', 'C4'), ('DATETIME', '01:01:2011:01:01:23'), ('VAL', '9')]),
'C5': OrderedDict([('TBLID', 'C5'), ('DATETIME', '01:01:2011:02:01:23'), ('VAL', '1')]),
'C6': OrderedDict([('TBLID', 'C6'), ('DATETIME', '01:01:2011:03:01:23'), ('VAL', '5')]),
'C7': OrderedDict([('TBLID', 'C7'), ('DATETIME', '01:01:2011:00:01:23'), ('VAL', '6')]),
'C8': OrderedDict([('TBLID', 'C8'), ('DATETIME', '01:01:2011:00:21:23'), ('VAL', '8')]),
'C9': OrderedDict([('TBLID', 'C9'), ('DATETIME', '01:01:2011:12:01:23'), ('VAL', '1')])}
>>> test.updateCsvDict(thedict)
>>> test.createCsv('wb')
"""
class CustomDictReader(csv.DictReader):
"""
override the next() function and use an
ordered dict in order to preserve writing back
into the file
"""
def __init__(self, f, fieldnames = None, restkey = None, restval = None, dialect ="excel", *args, **kwds):
csv.DictReader.__init__(self, f, fieldnames = None, restkey = None, restval = None, dialect = "excel", *args, **kwds)
def next(self):
if self.line_num == 0:
# Used only for its side effect.
self.fieldnames
row = self.reader.next()
self.line_num = self.reader.line_num
# unlike the basic reader, we prefer not to return blanks,
# because we will typically wind up with a dict full of None
# values
while row == []:
row = self.reader.next()
d = collections.OrderedDict(zip(self.fieldnames, row))
lf = len(self.fieldnames)
lr = len(row)
if lf < lr:
d[self.restkey] = row[lf:]
elif lf > lr:
for key in self.fieldnames[lr:]:
d[key] = self.restval
return d
class CSVRW(object):
def __init__(self):
self.file_name = ""
self.csv_delim = ""
self.csv_dict = collections.OrderedDict()
def setCsvFileName(self, name):
"""
@brief stores csv file name
@param name- the file name
"""
self.file_name = name
def getCsvFileName(self):
"""
@brief getter
@return returns the file name
"""
return self.file_name
def getCsvDict(self):
"""
@brief getter
@return returns a deep copy of the csv as a dictionary
"""
return copy.deepcopy(self.csv_dict)
def clearCsvDict(self):
"""
@brief resets the dictionary
"""
self.csv_dict = collections.OrderedDict()
def updateCsvDict(self, newCsvDict):
"""
creates a deep copy of the dict passed in and
sets it to the member one
"""
self.csv_dict = copy.deepcopy(newCsvDict)
def createCsvDict(self,dictKey, delim, handle = None, name = None, readMode = 'rb', **kwargs):
"""
@brief create a dict from a csv file where:
the top level keys are the first line in the dict, overrideable w/ **kwargs
each row is a dict
each row can be accessed by the value stored in the column associated w/ dictKey
that is to say, if you want to index into your csv file based on the contents of the
third column, pass the name of that col in as 'dictKey'
@param dictKey - row key whose value will act as an index
@param delim - csv file deliminator
@param handle - file handle (leave as None if you wish to pass in a file name)
@param name - file name (leave as None if you wish to pass in a file handle)
@param readMode - 'r' || 'rb'
@param **kwargs - additional args allowed by the csv module
@return bool - SUCCESS|FAIL
"""
self.csv_delim = delim
try:
if isinstance(handle, file):
self.setCsvFileName(handle.name)
reader = CustomDictReader(handle, delim, **kwargs)
else:
if None == name:
name = self.getCsvFileName()
else:
self.setCsvFileName(name)
reader = CustomDictReader(open(name, readMode), delim, **kwargs)
for row in reader:
self.csv_dict[row[dictKey]] = row
return True, self.getCsvDict()
except IOError:
return False, 'Error opening file'
def createCsv(self, writeMode, outFileName = None, delim = None):
"""
@brief create a csv from self.csv_dict
@param writeMode - 'w' || 'wb'
@param outFileName - file name || file handle
@param delim - csv deliminator
@return none
"""
if None == outFileName:
outFileName = self.file_name
if None == delim:
delim = self.csv_delim
with open(outFileName, writeMode) as fout:
for key in self.csv_dict.values():
fout.write(delim.join(key.keys()) + '\n')
break
for key in self.csv_dict.values():
fout.write(delim.join(key.values()) + '\n')
что у вас есть файл CSV под названием mylist.csv со следующими линиями:
a, b, c, d
e, f, g, h
i, j, k, l
, если вы хотите изменить «ч» стать «X» , можно использовать этот код, необходимо импортировать модуль CSV:
f = open('mylist.csv', 'r')
reader = csv.reader(f)
mylist = list(reader)
f.close()
mylist[1][3] = 'X'
my_new_list = open('mylist.csv', 'w', newline = '')
csv_writer = csv.writer(my_new_list)
csv_writer.writerows(mylist)
my_new_list.close()
Если вы хотите изменить определенный столбец для каждой строки, просто добавить цикл для перебора.
- 1. Запись данных в конкретную ячейку excel с использованием OpenXML-писателя
- 2. Python: записать данные в конкретную ячейку
- 3. Как написать конкретную ячейку в файле csv из Python
- 4. Запись в CSV-файл с использованием python
- 5. Редактирование кода CSV с использованием модуля CSV в python
- 6. Запись каждого столбца каждой строки таблицы в новую ячейку в файле csv с использованием python 3
- 7. Запись в CSV с использованием python - столбцы Datewise
- 8. Автоматическая запись заголовков с использованием csv python
- 9. Запись CSV в Python
- 10. Python - CSV-файл пуст после перезаписи с использованием модуля csv
- 11. ненужный "['', '']" при анализе CSV-файлов с использованием модуля csv python
- 12. Замена значений другими значениями с использованием модуля CSV в Python
- 13. Добавление конечных нулей в Python с использованием модуля csv
- 14. Запись в CSV в python
- 15. Найти конкретную ячейку из CSV-файла, разделенного пробелом, в bash
- 16. Запись информации в csv в python
- 17. Переименовать несколько ячеек в большой файл csv с помощью модуля csv Python
- 18. Как заполнить конкретную ячейку в столбце с использованием условного форматирования
- 19. Запись значений в конкретную ячейку в листе в pandas в python
- 20. Обновить конкретную ячейку в Handsontable
- 21. Запись MAC-адресов в csv с использованием scapy и python
- 22. Запись в определенные столбцы csv с использованием python
- 23. Запись координат XY в файл CSV с использованием Python
- 24. Запись обработанных данных в excel с использованием CSV Python
- 25. Измените конкретную ячейку в uicollectionview
- 26. Python: Запись в csv-файл
- 27. Запись в файл csv через django добавляет имя модуля в первую ячейку заголовка файла
- 28. Записать конкретную ячейку csv формы данных в другой файл с помощью python
- 29. Запись csv в Python 3
- 30. Python Запись списков в csv
определение функции createCSV (writemode' должен стать определением функции createCSV (я, ....) ' – pyInTheSky
после коррекции, что test.createCsv ('термометр') не записывает какие-либо изменения в файл CSV я загружен? Идеи? –
Я предполагаю, что вы забыли 'test.updateCsvDict (thedict)' ... Я полностью обновил код и пример использования. Надеюсь, что это поможет. Хотя класс не имеет защиты от мутекса, я как бы написал это с намерением что он может блокироваться вокруг getter/setter/writer ... поэтому функция createCsv записывает только копию класса csv, которая является чистым, если вы не вызвали обновление сначала. – pyInTheSky