假设您有这个 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 文件的创建方式,那么解释起来就不会那么模棱两可了。