假设您有以下 Excel 电子表格:
Note:
- 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 http://docs.python.org/library/functions.html#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 文件的创建方式,那么解释起来就不会那么含糊了。