我必须在我的csv文件中为特定单元格写入一个值(比如第8个单元格)。 我可以看到有一个csvwriter.writerow(row)
方法来写整行,但我没有看到任何东西写入一个特定的单元格的值。在Python中使用csv模块写入特定单元格
6
A
回答
8
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
授予创建一些通用函数,允许识别和更新特定的行和列是多一点工作,但没有太多更多,因为在Python中操作csv文件只是操纵一系列列表。
1
我同意,这很烦人。我完成了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')
0
假设你有一个名为mylist.csv csv文件具有以下行:
a, b, c, d
e, f, g, h
i, j, k, l
,如果你想修改“H”,成为“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()
如果要修改于各行的特定列,只需添加for循环迭代。
相关问题
- 1. 用python插入csv中的特定单元格的值
- 2. 写入csv文件中的特定单元格
- 3. python在一个单元格中写入csv
- 4. 如何在csv中使用Python将字符串写入一个单元格?
- 5. 使用python将数据表单特定的csv单元格写入另一个文件
- 6. C#从CSV文件中写出特定的单元格
- 7. python csv写入器将源代码片段写入单个单元格
- 8. 当使用python csv模块
- 9. python CSV模块 - 只获取一个单元格填充
- 10. 使用Python的CSV模块覆盖csv文件中的特定行
- 11. 在单个单元格中写入多个值csv
- 12. python CSV写入器 - 格式
- 13. 使用csv模块重写后的Python - CSV文件为空
- 14. 基于CSV单元格写入XML文件名Python
- 15. 将熊猫数据框值写入特定表格中的特定单元格。
- 16. 使用python写入特定列是.csv文件
- 17. 在Python中使用CSV模块替换其他值使用Python
- 18. Python - 用于将某些行写入新文件的CSV模块
- 19. 如何使用DataReader在excel单元格中编写如果特定单元格是使用C#的“ReadOnly”
- 20. Python XLWT:将列表写入单元格
- 21. python写入EXCEL单元格范围(NumPy?)
- 22. Python的CSV模块同时读写
- 23. 从C++在Excel中写入单元格 - 没有写入值,单元格为空
- 24. 用逗号和双引号在Python中的单元格中编写csv文件
- 25. Drupal 6:如何在使用表格模块时在特定单元格上使用form_set_error
- 26. 在python中使用模块netcdf4写入NetCDF3文件
- 27. 使用RPostgreSQL写入特定模式
- 28. 在Python中导入和使用模块
- 29. python将标题写入csv,一个单元格中的所有标题
- 30. Python:刮特殊字符写入CSV
'def createCSV(writemode' should become'def createCSV(self,....)' – pyInTheSky 2016-09-16 13:56:02
纠正后test.createCsv('wb')不会写入我加载的csv的任何更改?Ideas? – 2016-09-16 18:53:48
我猜你忘了'test.updateCsvDict(thedict)'......我已经完全更新了代码和样例用法,希望它有帮助,虽然这个类没有互斥锁保护,但我还是写了一个意图它可以锁定getter/setter/writer ...所以createCsv函数只会写出类的csv副本,这是处女读,除非你先调用update。 – pyInTheSky 2016-09-18 03:59:22