python csv模块写入_在python中使用csv模块写入特定单元格

我同意,这很烦人。我最终得到了csv.DictReader的子类。这允许基于单元格的就地查找编辑和转储。我在activestate上发布了代码:In place csv lookup, manipulation and exportimport 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值