Python CSV阅读器

时间:2019-01-09 18:34:07

标签: python csv

我有一个来自系统的CSV,该系统的文件顶部有很多垃圾,因此标题行大约在第5行,甚至可能是14行,具体取决于报表输出的垃圾。

我曾经使用:

idx = next(idx for idx, row in enumerate(csvreader) if len(row) > 2)

浏览少于两列的行,然后当它到达col标题(其中有12个)时,它将停下来,然后在读取CSV文件时可以将idx与跳过符一起使用。

系统进行了更新,有人认为最好通过在乱码之后添加11个空白逗号来使标头计数对齐来使CSV文件有效。

所以现在我有一个CSV,如:

sadjfhasdkljfhasd,,,,,,,,,,
dsfasdgasfg,,,,,,,,,,
time,date,code,product 

等。

我尝试过:

idx = next(idx for idx, row in enumerate(csvreader) if row in (None, "") > 2)

但是我认为这是熊猫的事情,但是失败了。

关于如何到达标题行的任何想法吗?

代码:

lmf = askopenfilename(filetypes=(("CSV Files",".csv"),("All Files","*.*")))
    # Section gets row number where headers start
    with open(lmf, 'r') as fin:
        csvreader = csv.reader(fin)
        print(csvreader)
        input('hold')
        idx = next(idx for idx, row in enumerate(csvreader) if len(row) > 2)

    # Reopens file parsing the number for the row headers
    lmkcsv = pd.read_csv(lmf, skiprows=idx)
    lm = lm.append(lmkcsv)
    print(lm)

2 个答案:

答案 0 :(得分:1)

由于您的csv现在是有效文件,并且您只想过滤掉标题行而没有一定数量的列,因此可以直接在pandas中进行操作。

import pandas as pd
minimum_cols_required = 3
lmkcsv = pd.read_csv()
lmkcsv = lmkcsv.dropna(thresh=minimum_cols_required, inplace=True)

如果您的csv数据也包含很多空值,并且都陷入了此阈值,那么只需稍微修改一下代码即可:

idx = next(idx for idx, row in enumerate(csvreader) if len(set(row)) > 3)

我不确定None在什么情况下会返回,因此set(row)应该会返回。如果您的标头也重复了,请执行以下操作:

from collections import Counter
# ...
idx = next(idx for idx, row in enumerate(csvreader) if len(row) - Counter(row)[''] > 2)

答案 1 :(得分:0)

如何删除起始行,执行一些逻辑(例如检查许多“,”存在的或某个单词)。像这样:

f = open("target.txt","r+")
d = f.readlines()
f.seek(0)
for i in d:
    if "sadjfhasdkljfhasd" not in i:
        f.write(i)
f.truncate()

f.close()

之后,请正常阅读文件。