【问题标题】:How to read specific column under a string from csv file using python?如何使用python从csv文件中读取字符串下的特定列?
【发布时间】:2019-04-30 12:13:10
【问题描述】:

我正在运行系统性能测试,我需要检查 CSV 文件中的测试结果。例如,我在下面分享的 test.csv 文件:

https://docs.google.com/spreadsheets/d/1lUldk4N_5kEAETWdd2B5-x0UOpA_O0aus7x49fEqnPk/edit?usp=sharing

请注意,结果“PASS”或“FAIL”将是一个超链接。

问题:我需要检查驱动程序问题测试是否通过。例如,如果我运行 100 个循环,则 deviceproblem 下的结果将被列出 100 次。如果100个循环中只有1个失败,则认为测试失败。

我能够在“driverproblem”字段下获取一行的值(结果),但我在该行中存在的所有其他字段的超链接中获得了结果,而不仅仅是一个字段。

有什么方法可以让我得到字段的结果“PASS”或“FAIL”:“driverproblem”或“Devicemanager”或“Crash”?

我尝试过以下方法:

with open(filename, 'r') as csv_file:
for index,row in enumerate(csv_file):
        if "driverproblem" in row.split(','):
            for i in range(10):
                line = csv_file.next().split()
                a= line[2].split(',')
                print a

但我得到的结果如下:

['PASS:Basictest"")"', '"=HYPERLINK(""..\..\Reports\testreport_03-20-19-07-37-01\1.1.1_test_os\Driver_info.xml"" ', '""PASS"")"', '"=HYPERLINK(""..\..\Reports\testreport_03-20-19-07-37-01\1.1.1_TEST_SYS\drivertest_Log_Delta.xml""', '""PASS"")"', '"=HYPERLINK(""..\..\Reports\testreport_03-20-19-07-37-01\systemtestlogss\systemtestlogs.csv""', '""PASS "")"', '"=HYPERLINK(""..\..\Reports\testreport_03-20-19-07-37-01\systemtestlogss\systemtestlogs.csv""', '""PASS"")" ', '"=HYPERLINK(""..\..\Reports\testreport_03-20-19-07-37-01\systemtestlogss\systemtestlogs.csv""', '""PASS:Connected(via']

而我只需要字段 ""=HYPERLINK(""..\\..\\Reports\\testreport_03-20-19-07-37-01\\1.1.1_TEST_SYS\\drivertest_Log_Delta.xml""', '""PASS"")" 位于 csv 文件中的“Drivertest”字段下。

【问题讨论】:

    标签: python python-2.7 csv


    【解决方案1】:

    试试这个:

    with open("test.csv", 'r') as csv_file:
            arr = []
            crash = []
            devicemanager = []
            for row in csv_file:                              
                    rowarr = row.split(',')
                    arr.append(rowarr)
                    devicemanager.append(rowarr[5])
                    crash.append(rowarr[7])
    

    输出:

    ['\n', '\n', '\n', '\n', '\n', '\n', 'Crash\n', 'PASS\n', 'NA']
    ['', '', '', '', '', '', 'Devicemanager', 'PASS', 'NA']
    

    您可以遍历列表崩溃和设备管理器以查找字段 PASS 和 FAIL。请注意,这是 test.csv 的第 5 列和第 7 列。

    Total No Of Cycles,2,,,,,,
    Passed Cycles,2,,,,,,
    Failed Cycles,0,,,,,,
    Ignored Cycles,0,,,,,,
    ,,,,,,,
    ,,,,,,,
    Cycle Number,Cycle PASS/FAIL,Expected State,Test,Driver problem,Devicemanager,Memory Dump,Crash
    1,PASS,S4,PASS:S4,PASS,PASS,PASS,PASS
    2,PASS,S4,PASS:S4,NA,NA,NA,NA
    

    弃用:Python 2.7 将于 2020 年 1 月 1 日结束生命周期。请升级您的 Python,因为 Python 2.7 在该日期之后将不再维护。 来源: repl.it

    要获得更简洁的版本,请使用 csv 模块——用它编写代码更快:

    import csv
    
    csv_file_path = 'test.csv'
    csvFile = open(csv_file_path,'r')
    csvrdr = csv.reader(csvFile, delimiter=',')
    devicemanager = []
    crash = []
    for row in csvrdr:
        devicemanager.append(row[5])
        crash.append(row[7])
    
    
    print(crash)
    print(devicemanager)
    

    输出:

    ['', '', '', '', '', '', 'Crash', 'PASS', 'NA']
    ['', '', '', '', '', '', 'Devicemanager', 'PASS', 'NA']
    

    这两个示例都适用于 python 2 和 3,因此您应该考虑升级到 python 3,因为不推荐使用 python 2。

    【讨论】:

    • 感谢您让我知道另一种方法。我以某种方式使用 pandas 对其进行了排序: file = pandas.read_csv("filename.csv",skiprows=20,usecols=["Devicemanager","driverproblem"] 这给出了数组形式的输出,可以使用 numpy 转换为列表: 将 numpy 导入为 np convert_to_list = np.array(file).tolist()
    • 好的,太好了! ??
    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多