我有一个来自系统的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)
答案 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()
之后,请正常阅读文件。