你至少可以部分地側步什麼csv
模塊會創建自己的單身None
般類/值的版本:
class NONE(object):
def __repr__(self): # method csv.writer class uses to write values
return 'NONE' # unique string value to represent None
def __len__(self): # method called to determine length and truthiness
return 0 # (optional)
NONE = NONE() # singleton instance of the class
import csv
import cStringIO
data = [['None value', None], ['NONE value', NONE], ['empty string', '']]
f = cStringIO.StringIO()
csv.writer(f).writerows(data)
f = cStringIO.StringIO(f.getvalue())
print " input:", data
print "output:", [e for e in csv.reader(f)]
結果:
input: [['None value', None], ['NONE value', NONE], ['empty string', '']]
output: [['None value', ''], ['NONE value', 'NONE'], ['empty string', '']]
使用NONE
而不是None
將保留足夠的信息,以便您能夠區分它和任何實際的空字符串數據值。
甚至更好的選擇...
您可以用同樣的方法來實現對相對輕便csv.reader
和csv.writer
「代理」類—必要的,因爲你不能真正繼承內置csv
類其中都是在C —中編寫的,沒有引入大量開銷(因爲大部分的處理仍然由底層的內置插件執行)。這將使得完全透明,因爲它全部封裝在代理內。
import csv
class csvProxyBase(object): _NONE = '<None>' # unique value representing None
class csvWriter(csvProxyBase):
def __init__(self, csvfile, *args, **kwrags):
self.writer = csv.writer(csvfile, *args, **kwrags)
def writerow(self, row):
self.writer.writerow([self._NONE if val is None else val for val in row])
def writerows(self, rows):
map(self.writerow, rows)
class csvReader(csvProxyBase):
def __init__(self, csvfile, *args, **kwrags):
self.reader = csv.reader(csvfile, *args, **kwrags)
def __iter__(self):
return self
def next(self):
return [None if val == self._NONE else val for val in self.reader.next()]
if __name__ == '__main__':
import cStringIO as StringIO
data = [['None value', None], ['empty string', '']]
f = StringIO.StringIO()
csvWriter(f).writerows(data)
f = StringIO.StringIO(f.getvalue())
print " input:", data
print "output:", [e for e in csvReader(f)]
結果:
input: [['None value', None], ['empty string', '']]
output: [['None value', None], ['empty string', '']]
Yep證實:在Modules/_csv.c中查看csv_writerow(if(field == Py_None)...)。沒有辦法區分''和None。真是一個恥辱,鑑於方言抽象,你會希望有更多的靈活性。你提到csv模塊的其他限制,你介意闡述(如果還有其他問題,我真的應該開始看其他csv閱讀寫作)? – user1509316 2012-07-08 00:48:19
我發現一個有限的問題是分隔符必須是單個字符。所以你不能解析一個文件,其中列被兩個標籤分隔。就像你遇到的None事情一樣,這很容易解決,但仍然很煩人。 – BrenBarn 2012-07-08 02:21:02
另一個是模塊內的硬編碼ascii限制。 – 2013-01-18 14:02:11