从CSV文件,Python中提取某些标头的数据

时间:2019-01-10 07:26:31

标签: python python-3.x

C.N:公司名称 C.N2:公司名称

C.N    Cmp Cmp  Cmp  Cmp   Cmp Cmp Cmp  
C.N2   IGN IGT  IGA        IGB IGB                
php     12  12   11   35     5   1   6 
java    12  12   11   35     5   1   6 
react   100 100 100   35   100  100  6  
IOS     12  12   11   35     5   1   6 
python  12  12   11   35     5   1   6 
JSX     12  12   11   35     5   1   6 

我在此结构中具有CSV文件。尝试解析100和C.N

import csv

take = ["IGN","IGT", "IGB"]

with open("datas.csv", "r") as Data:
    Reader = csv.reader(Data)

    for line in Reader:
        if line[0] == "IOS":
            break
        print(line)

我怎样才能选择React数据?但是,如果它包含C.N 2,我的意思是可以选择某些Header的某些数据吗?并发送到其他CSV文件?

预期的投放量是

Cmp   Cmp   Cmp      Cmp   Cmp        Cmp    Cmp  Cmp
100   100   100      100   100        100   100  100

如您所见,我跳过了空单元格及其数据

2 个答案:

答案 0 :(得分:1)

我一直建议人们在解析excel文件时选择熊猫。将它们全部加载到数据框中,使用起来会变得更加容易。

def Flow_Of_Ships_rule(model, i, v, h):
    print(h)
    # max(h - model.TimeVisitingPort[k] - model.TimeTravelingPort2Port[k, i]) = 2 
    if h == 1:
        return sum(model.VesselTravel[i, j, v, h] for j in model.Node if j!=i) + model.VesselWait[i, v, 8]\
    - sum(model.VesselTravel[k, i, v, (8 - model.TimeTravelingPort2Port[k, i])] for k in model.Node if k!=i) - model.VesselWait[i, v, 7] == 0
    elif h == 2:
        return sum(model.VesselTravel[i, j, v, h] for j in model.Node if j!=i) + model.VesselWait[i, v, h - model.TimeVisitingPort[i]]\
    - sum(model.VesselTravel[k, i, v, (9 - model.TimeTravelingPort2Port[k, i])] for k in model.Node if k!=i) - model.VesselWait[i, v, 8] == 0 
    else:
        return sum(model.VesselTravel[i, j, v, h] for j in model.Node if j!=i) + model.VesselWait[i, v, h - model.TimeVisitingPort[i]]\
    - sum(model.VesselTravel[k, i, v, (h - model.TimeVisitingPort[k] - model.TimeTravelingPort2Port[k, i])] for k in model.Node if k!=i) - model.VesselWait[i, v, h - model.TimeVisitingPort[i] - 1] == 0

model.Flow_Of_Ships = Constraint(model.Node, model.Vessel, model.Time, rule=Flow_Of_Ships_rule)

###############################################################################
def One_Flow_Of_Ships_rule(model, v, h):
    return sum(sum(model.VesselTravel[i, j, v, h] for j in model.Node) for i in model.Node) + sum(model.VesselWait[i, v, h] for i in model.Node) <= 1 

model.One_Flow_Of_Ships = Constraint(model.Vessel, model.Time, rule=One_Flow_Of_Ships_rule)

###############################################################################
def No_Travel_rule(model, i, j, v, h):
    if i != j:
        return Constraint.Skip
    else: 
        return model.VesselTravel[i, j, v, h] == 0

model.No_Travel = Constraint(model.Node, model.Node, model.Vessel, model.Time, rule=No_Travel_rule) 

答案 1 :(得分:0)

最终编辑:


问题描述

发布部分 real 数据文件(https://imgur.com/a/AgRMC8S)后,
enter image description here
问题和解决方案立即变得清晰起来:

您的csv文件是一个简单的,完全符合标准的csv文件,以逗号作为分隔符(参见蓝色标记),因此即使是空单元格也可以轻松处理,因为它们只是两个直接连续的逗号(请参见标记)。红色)。
即您的样本数据与您的真实数据无关...
正确的等效样本数据文件应为

C.N,Cmp,Cmp,Cmp,Cmp,Cmp,Cmp,Cmp
C.N2,IGN,IGT,IGA,,IGB,IGB,
php,12,12,11,35,5,1,6 
java,12,12,11,35,5,1,6 
react,100,100,100,35,100,100,6
IOS,12,12,11,35,5,1,6 
python,12,12,11,35,5,1,6 
JSX,12,12,11,35,5,1,6

这是为什么@kerwei的基于简单pd.read_csv并以逗号作为默认分隔符的熊猫解决方案为您工作的原因,尽管示例csv数据中没有单个逗号。


回答正确的问题

您的代码代码段中,打印每行直到,直到您感兴趣的行之后。
但是您应该什么都不打印除了,您会到达您感兴趣的行:

import csv

with open("datas.csv", "r") as Data:
    Reader = csv.reader(Data)

    for line in Reader:
        if line[0] == "react":
            print(line)
            break

但是,使用pandas可以更好地解决您对行进行过滤的其他要求,因此我的 pandas方法如下:

import pandas as pd
df = pd.read_csv(filename, index_col=0)
df_r = df.loc[['C.N2', 'react'], ~df.loc['C.N2'].isna()]

#       Cmp Cmp.1 Cmp.2 Cmp.4 Cmp.5
#C.N                               
#C.N2   IGN   IGT   IGA   IGB   IGB
#react  100   100   100   100   100

仅将此结果的数据行(不带标头和索引的df)写入另一个csv文件就很容易:

df_r.to_csv('react.csv', header=False, index=False)

#IGN,IGT,IGA,IGB,IGB
#100,100,100,100,100

但是您当然也可以 在没有外部库的情况下完成

with open(filename) as f:
    next(f)
    header = f.readline().strip().split(',')
    drop_idx = [i for i, h in enumerate(header) if not h]
    for line in f:
        if line.startswith('react'):
            data = line.strip().split(',')
            break

for i in drop_idx[::-1]:
    header.pop(i)
    data.pop(i)
with open('react.csv', 'w') as f:
    f.write(','.join(header[1:]) + '\n')
    f.write(','.join(data[1:]))

最后提出一个未来的问题:请按照[mcve]的方式尝试以某种方式简化您的问题,即不会丢失您实际问题的重要属性,这将节省大量时间