mo5*_*470 14 python csv newline
我有一个CSV文件,其中包含包含换行符的字段,例如:
A, B, C, D, E, F
123, 456, tree
, very, bla, indigo
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,第二行中的第三个字段是"tree \n"
我尝试了以下方法:
import csv
catalog = csv.reader(open('test.csv', 'rU'), delimiter=",", dialect=csv.excel_tab)
for row in catalog:
print "Length: ", len(row), row
Run Code Online (Sandbox Code Playgroud)
我得到的结果是这样的:
Length: 6 ['A', ' B', ' C', ' D', ' E', ' F']
Length: 3 ['123', ' 456', ' tree']
Length: 4 [' ', ' very', ' bla', ' indigo']
Run Code Online (Sandbox Code Playgroud)
有谁知道如何快速删除多余的换行符?
谢谢!
the*_*olf 17
假设您有此Excel电子表格:

注意:
将其保存为Excel中的CSV,您将获得此csv文件:
A1,B1,"C1,+comma",D1
,B2,"line 1
line 2",D2
,,C3,"D3,+comma"
,,,D4 space
Run Code Online (Sandbox Code Playgroud)
可能,你会想要将它读入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)
Run Code Online (Sandbox Code Playgroud)
正确生成Excel中表示的4x4 List列表矩阵:
Length: 4 ['A1', 'B1', 'C1,+comma', 'D1']
Length: 4 ['', 'B2', 'line 1\nline 2', 'D2']
Length: 4 ['', '', 'C3', 'D3,+comma']
Length: 4 ['', '', '', 'D4 space']
Run Code Online (Sandbox Code Playgroud)
您发布的示例CSV文件缺少字段周围的引号,并带有"额外换行符",表示该换行符的含义不明确.它是新行还是多行字段?
因此,您只能解释此csv文件:
A, B, C, D, E, F
123, 456, tree
, very, bla, indigo
Run Code Online (Sandbox Code Playgroud)
像这样的一维列表:
with open("test.csv", 'rU') as csvIN:
outCSV=[field.strip() for row in csv.reader(csvIN, delimiter=',')
for field in row if field]
Run Code Online (Sandbox Code Playgroud)
这产生了这个一维列表:
['A', 'B', 'C', 'D', 'E', 'F', '123', '456', 'tree', 'very', 'bla', 'indigo']
Run Code Online (Sandbox Code Playgroud)
然后可以根据需要将其解释并重新分组到任何子分组中.
python中的惯用重组方法使用zip如下:
>>> zip(*[iter(outCSV)]*6)
[('A', 'B', 'C', 'D', 'E', 'F'), ('123', '456', 'tree', 'very', 'bla', 'indigo')]
Run Code Online (Sandbox Code Playgroud)
或者,如果你想要一个列表列表,这也是惯用的:
>>> [outCSV[i:i+6] for i in range(0, len(outCSV),6)]
[['A', 'B', 'C', 'D', 'E', 'F'], ['123', '456', 'tree', 'very', 'bla', 'indigo']]
Run Code Online (Sandbox Code Playgroud)
如果您可以更改CSV文件的创建方式,则解释起来就不那么模糊了.
如果您有非空白单元格,这将有效
data = [['A', ' B', ' C', ' D', ' E', ' F'],
['123', ' 456', ' tree'],
[' ', ' very', ' bla', ' indigo']]
flat_list = chain.from_iterable(data)
flat_list = [cell for cell in flat_list if cell.strip() != ''] # remove blank cells
rows = [flat_list[i:i+6] for i in range(0, len(flat_list), 6)] # chunk into groups of 6
print rows
Run Code Online (Sandbox Code Playgroud)
输出:
[['A', ' B', ' C', ' D', ' E', ' F'], ['123', ' 456', ' tree', ' very', ' bla', ' indigo']]
Run Code Online (Sandbox Code Playgroud)
如果输入中有空白单元格,则大部分时间都可以使用:
data = [['A', ' B', ' C', ' D', ' E', ' F'],
['123', ' 456', ' tree'],
[' ', ' very', ' bla', ' indigo']]
clean_rows = []
saved_row = []
for row in data:
if len(saved_row):
row_tail = saved_row.pop()
row[0] = row_tail + row[0] # reconstitute field broken by newline
row = saved_row + row # and reassemble the row (possibly only partially)
if len(row) >= 6:
clean_rows.append(row)
saved_row = []
else:
saved_row = row
print clean_rows
Run Code Online (Sandbox Code Playgroud)
输出:
[['A', ' B', ' C', ' D', ' E', ' F'], ['123', ' 456', ' tree ', ' very', ' bla', ' indigo']]
Run Code Online (Sandbox Code Playgroud)
然而,即使第二种解决方案也会因输入而失败
A,B,C,D,E,F\nG
1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输入是模糊的,没有算法能够猜测你是否意味着:
A,B,C,D,E,F
G\n1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)
(或上面的输入)
如果您可能遇到这种情况,则必须返回保存数据的人员并将其保存为更干净的格式(btw开放式办公室引用CSV文件中的换行符远远优于Excel).
| 归档时间: |
|
| 查看次数: |
36257 次 |
| 最近记录: |