相当于grep,但不使用open()

时间:2012-06-14 12:38:23

标签: python grep

我有以下脚本(见下文),它采用stdin并操作一些简单的文件。

# Import Modules for script
import os, sys, fileinput, platform, subprocess

# Global variables
hostsFile = "hosts.txt"
hostsLookFile = "hosts.csv"

# Determine platform
plat = platform.system()

if plat == "Windows":

# Define Variables based on Windows and process
    currentDir = os.getcwd()
    hostsFileLoc = currentDir + "\\" + hostsFile
    hostsLookFileLoc = currentDir + "\\" + hostsLookFile
    ipAddress = sys.argv[1]
    hostName = sys.argv[2]
    hostPlatform = sys.argv[3]
    hostModel = sys.argv[4]

    # Add ipAddress to the hosts file for python to process 
    with open(hostsFileLoc,"a") as hostsFilePython:
        for line in open(hostsFilePython, "r"):
            if ipAddress in line:
                print "ipAddress \(" + ipAddress + "\) already present in hosts file"
            else:
                print "Adding ipAddress: " + ipAddress + " to file"
                hostsFilePython.write(ipAddress + "\n")

    # Add all details to the lookup file for displaying on-screen and added value
    with open(hostsLookFileLoc,"a") as hostsLookFileCSV:
        for line in open(hostsLookFileCSV, "r"):
            if ipAddress in line:
                print "ipAddress \(" + ipAddress + "\) already present in lookup file"
            else:
                print "Adding details: " + ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + " to file"
                hostsLookFileCSV.write(ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + "\n")

if plat == "Linux":

# Define Variables based on Linux and process
    currentDir = os.getcwd()
    hostsFileLoc = currentDir + "/" + hostsFile
    hostsLookFileLoc = currentDir + "/" + hostsLookFile
    ipAddress = sys.argv[1]
    hostName = sys.argv[2]
    hostPlatform = sys.argv[3]
    hostModel = sys.argv[4]

    # Add ipAddress to the hosts file for python to process 
    with open(hostsFileLoc,"a") as hostsFilePython:
        print "Adding ipAddress: " + ipAddress + " to file"
        hostsFilePython.write(ipAddress + "\n")

    # Add all details to the lookup file for displaying on-screen and added value
    with open(hostsLookFileLoc,"a") as hostsLookFileCSV:
        print "Adding details: " + ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + " to file"
        hostsLookFileCSV.write(ipAddress + "," + hostName + "," + hostPlatform + "," + hostModel + "\n")

此代码显然不起作用,因为for line in open(hostsFilePython, "r"):语法错误...我无法使用“open()”的当前文件对象。然而,这是我想要实现的,我该怎么做?

2 个答案:

答案 0 :(得分:2)

您想使用the a+ mode打开文件,以便您可以读取和写入,然后只使用现有的文件对象(hostsFilePython)。

但是,这仍然无效,因为您只能在文件耗尽前迭代一次。

值得注意的是,这不是很有效率。更好的计划是将数据读入集合,使用新值更新集合,然后将集合写入文件。 (正如评论中所指出的,集合不会保留重复数据(对您的目的有用)和订单,这可能适用于您,也可能不适合您。如果没有,那么您可能需要使用列表,这样效率会降低)。

答案 1 :(得分:0)

with open(hostsFileLoc) as hostsFilePython:
    lines = hostsFilePython.readlines()

for filename in lines:
    with open(hostsFileLoc, 'a') as hostFilePython:
        with open(filename) as hostsFile:
            for line in hostsFile.readlines():
                if ipAddress in line:
                   print "ipAddress \(" + ipAddress + "\) already present in hosts file"
                else:
                   print "Adding ipAddress: " + ipAddress + " to file"
                   hostsFilePython.write(ipAddress + "\n")

读取默认模式,因此您无需明确传递r