我有一个混合的CSV文件,开始时有两列包含字符串数据,在大约100行之后,该文件在两列以上具有浮点值。问题是当我使用csv.reader读取文件时,它将所有数据读取为字符串,并且无法对浮点数据进行任何操作。最后,我将删除字符串数据,因为CSV文件将被传输到DB。 关于如何做到这一点的任何想法?
文件外观示例:
aaa,bbb
aa,bbbb
aaa,dddd
eee,rrr
...
12.2,15.345,13.566,14.66,100.5
13,545,245.452,-0.422
答案 0 :(得分:1)
如果您知道如何丢弃100行:
with open(filename, 'rt') as r:
for i in range(100):
next(r)
for row in csv.reader(r, delimiter=',', quoting=csv.QUOTE_NONNUMERIC):
...
如果您事先不知道:
with open(filename, 'rt') as r:
z = itertools.dropwhile(lambda line: line.count(',') == 1 or line.count('"') > 0, r)
for row in csv.reader(z, delimiter=',', quoting=csv.QUOTE_NONNUMERIC):
...
代码未经测试,但要旨应明确:在r
上进行迭代,直到消耗掉不需要的内容为止,然后将文件对象传递给csv.reader
。
答案 1 :(得分:1)
通过pandas
,您可以使用skiprows
参数从csv顶部跳过行。假设前4行具有字符串类型的行,则可以指定skiprows=4
。操作方法如下:
In [1]: import pandas as pd
In [2]: test_string = """aaa,bbb
...: aa,bbbb
...: aaa,dddd
...: eee,rrr
...: num1,num2,num3,num4,num5
...: 12.2,15.345,13.566,14.66,100.5
...: 13,545,245.452,-0.422"""
In [3]: with open("test.csv", 'w') as f:
...: f.write(test_string)
...:
In [4]: df = pd.read_csv("test.csv", skiprows=4)
In [5]: df.head()
Out[5]:
num1 num2 num3 num4 num5
0 12.2 15.345 13.566 14.660 100.5
1 13.0 545.000 245.452 -0.422 NaN