【问题标题】:compare two different formats csv fils with python用python比较两种不同格式的csv文件
【发布时间】:2019-12-18 14:05:38
【问题描述】:

我需要比较两种不同格式的 CSV 文件,第一个文件包含主机名和 IP 地址,第二个文件包含主机名、IP 地址、操作系统类型和正常运行时间。 目标是从第一个文件中获取主机名,并将其与第二个文件中的主机名进行比较,如果可以,代码会为我提供操作系统类型和正常运行时间。 这是我的第一次代码测试。

import sys

# f = sys.stdin
# If you need to open a file instead:
f_vm_srv = open('serveurs.csv')
f_srv_list =  open('fqdn-ip.txt')

for line1 in f_srv_list:
    hostname=line1.strip().split(";")
    for line in f_vm_srv:
        fields = line.strip().split(";")
        if fields[0] == hostname[0]:
            print (fields[12])

f_vm_srv.close()
f_srv_list.close()

但是这段代码只给了我第一行结果。

【问题讨论】:

  • 首先至少为内部循环读取所有行,因为当它到达文件末尾时它不会再次从文件中读取行(这意味着当你第二次运行内部循环时)

标签: python file csv


【解决方案1】:

尝试将您的代码更改为:

import sys

# f = sys.stdin
# If you need to open a file instead:
f_vm_srv = open('serveurs.csv')
f_srv_list =  open('fqdn-ip.txt')

# read in the lines from the file
f_svr_list_lines = f_srv_list.readlines()
f_vm_srv_lines = f_vm_srv.readlines()

for line1 in f_svr_list_lines:
    hostname=line1.strip().split(";")
    for line in f_vm_srv_lines:
        fields = line.strip().split(";")
        if fields[0] == hostname[0]:
            print (fields[12])

f_vm_srv.close()
f_srv_list.close()

您还可以考虑以 Pandas DataFrames 的形式读取文件(请参阅 tha pandas read_csv function)。

【讨论】:

    【解决方案2】:

    如果您将不得不在 python 中大量使用 csv 并需要执行复杂的操作,那么我强烈建议您熟悉 pandas

    您将能够使用 read_csv 轻松加载 2 个文件,并使用 ["column_name"] 运算符轻松提取列。

    【讨论】:

      【解决方案3】:

      您可以使用 Pandas 库,对读取 csv 很有用。

      假设 file1 是包含 IP 和主机名的文件,另一个文件是 file2。此外,我认为这两个文件的组成如下:

      IP_value;hostname_value //file1
      IP_value;hostname_value;OStype_value;uptime_value //file2
      

      所以,我阅读了 csv 文件:

      import sys
      import pandas as pd
      
      df1 = pd.read_csv('file1.csv', sep=';', names=['ip', 'hostname'])
      df2 = pd.read_csv('file2.csv', sep=';', names=['ip', 'hostname', 'ostype', 'uptime'])
      

      现在,已经创建了两个 Dataframe 对象。你在df2 上迭代df1,如果df1ip 等于df2ip,你可以做你想做的事。

      提示:您可以使用 df1['ip']! 访问 ip 值!

      for ip1 in df1['ip']:
          for ip2 in df2['ip']:
              if ip1 == ip2:
                  //Your code
      

      另一种方法是使用 Numpy 库的函数 wherePandas 库的函数 merge

      特别是,如果您想检查某个列上的相等值,函数merge 很有用。您将在一个新的数据框 (df3) 中合并两个数据框(在您的情况下为 df1df2):

      df3 = pd.merge(df1, df2, on=['ip'], how='inner')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多