假设您有这个Excel电子表格:
注:C2中的多行细胞
在C1和D3中嵌入逗号
空白单元格和D4中有空格的单元格。
将其保存为Excel中的CSV,您将得到此CSV文件:A1,B1,"C1,+comma",D1
,B2,"line 1
line 2",D2
,,C3,"D3,+comma"
,,,D4 space
假定,您希望将其读入Python中,其中空白单元格仍然具有含义,并且正确地嵌入内嵌逗号。
所以,这个:with open("test.csv", 'rU') as csvIN:
outCSV=(line for line in csv.reader(csvIN, dialect='excel'))
for row in outCSV:
print("Length: ", len(row), row)
正确生成Excel中表示的4x4列表矩阵:Length: 4 ['A1', 'B1', 'C1,+comma', 'D1']
Length: 4 ['', 'B2', 'line 1\nline 2', 'D2']
Length: 4 ['', '', 'C3', 'D3,+comma']
Length: 4 ['', '', '', 'D4 space']
您发布的示例CSV文件在字段周围缺少引号,并且有一个“额外的换行符”表示该换行符的含义不明确。是新行还是多行字段?
因此,您只能解释此csv文件:A, B, C, D, E, F
123, 456, tree
, very, bla, indigo
像这样的一维列表:with open("test.csv", 'rU') as csvIN:
outCSV=[field.strip() for row in csv.reader(csvIN, delimiter=',')
for field in row if field]
它产生了这个一维列表:['A', 'B', 'C', 'D', 'E', 'F', '123', '456', 'tree', 'very', 'bla', 'indigo']
然后,可以根据需要将其解释并重新组合为任何子组。
python中惯用的重新组合方法使用zip,如下所示:>>> zip(*[iter(outCSV)]*6)
[('A', 'B', 'C', 'D', 'E', 'F'), ('123', '456', 'tree', 'very', 'bla', 'indigo')]
或者,如果您想要一个列表列表,这也是惯用的:>>> [outCSV[i:i+6] for i in range(0, len(outCSV),6)]
[['A', 'B', 'C', 'D', 'E', 'F'], ['123', '456', 'tree', 'very', 'bla', 'indigo']]
如果您可以更改CSV文件的创建方式,那么解释起来就不那么含糊不清了。