我需要加载一个csv文件,其中空格用作制表,如下所示:
2021-08-27 12:21:28.259 2021-08-25 17:36:52.045 1,9253 -2,0298 -1,3901 356,6895 111,0229 893,0664 -162,1033 -35,9802 131,6052
但是有些行格式不好,其中值太大,并且没有空格
2021-08-27 12:21:28.350 2021-08-25 17:36:52.155 -4,7617 -5,2017 -8,0220 -1484,8022 -127,9907-1999,7559 99,7943 -55,4700 -109,0063
所以当我导入csv与pd.read_csv()
我得到一些行移位值。
我尝试逐行编辑文本文件,在-
之前添加空白,但处理时间太长。
是否有一个快速的方法来编辑csv,而加载?
好东西每个列总是在固定位置开始(和结束),但我没有找到任何方法加载csv在熊猫知道列开始/结束索引
更新:
使用read_fwf
如下:
pandas.read_fwf('test.csv', header=None)
可能可以工作,但不能与问题中提供的文件示例一起工作。
可以帮助python通过像这样提供字段的位置:
colspecs = [(0, 10), (11, 23), (24, 34), (35, 47), (48, 58), (58, 68), (68, 78), (78, 89), (89, 99), (99, 109), (109, 120), (120, 130), (130, 140)]
pandas.read_fwf('test.csv', infer_nrows = 13, header=None, colspecs = colspecs)
链接到文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_fwf.html
这个答案描述了如何手动解析文件。较好的解决方案是使用pandas.read_fwf
。
由于所有列的大小相同,因此可以使用列表推导式拆分列:
# data.csv
2021-08-27 12:21:28.350 2021-08-25 17:36:52.155 -4,7617 -5,2017 -8,0220 -1484,8022 -127,9907-1999,7559 99,7943 -55,4700 -109,0063
2021-08-27 12:21:28.259 2021-08-25 17:36:52.045 1,9253 -2,0298 -1,3901 356,6895 111,0229 893,0664 -162,1033 -35,9802 131,6052
import itertools # accumulate
def load_file(filename, widths):
with open(filename, 'r') as f:
table = []
for line in f:
table.append([line[p:p+w] for w,p in zip(widths, itertools.accumulate(widths, initial=0))])
return table
print(load_file('data.csv', [11,13,11,13,10,10,10,11,10,10,11,10,10]))
# [['2021-08-27 ', '12:21:28.350 ', '2021-08-25 ', '17:36:52.155 ', ' -4,7617', ' -5,2017', ' -8,0220', ' -1484,8022', ' -127,9907', '-1999,7559', ' 99,7943', ' -55,4700', ' -109,0063'],
# ['2021-08-27 ', '12:21:28.259 ', '2021-08-25 ', '17:36:52.045 ', ' 1,9253', ' -2,0298', ' -1,3901', ' 356,6895', ' 111,0229', ' 893,0664', ' -162,1033', ' -35,9802', ' 131,6052']]
然后你可以直接将结果表加载到pandas
中,并希望它能正确解析所有的数字和日期;或者,如果您尝试更手动地解析值,那么.strip()
将非常有助于删除所有尾随空格。